Trong Java tôi có thể làm điều này:ký tự đại diện Generic trong khai báo biến trong Scala
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
... giả định rằng (MyImpl implements MyInterface
) tất nhiên.
Tương tự cho điều này trong Scala, khi sử dụng Buffer
là gì?
import java.lang.reflect._
import scala.collection.mutable._
class ScalaClass {
val list:Buffer[MyInterface] = null
def setList(l: Buffer[MyImpl]) = {
list = l
}
}
Điều này (tất nhiên) không biên dịch - nhưng làm cách nào để khai báo biến số list
theo cách như vậy?
EDIT; Tôi đang thêm một chút nữa. Sự khác biệt rõ ràng là một cái gì đó để làm với thực tế là trong Java, generics là không bao giờ covariant trong T, trong khi ở Scala họ có thể hoặc là covariant hay không. Ví dụ, lớp Scala List
là biến thể trong T (và nhất thiết là không thay đổi). Vì vậy sau sẽ biên dịch:
class ScalaClass {
val list:List[MyInterface] = null
def setList(l: List[MyImpl]) = {
list = l
}
}
Tôi vẫn đang phải vật lộn một chút với lỗi biên dịch:
Covariant type T occurs in contravariant position in ...
Ví dụ; lỗi biên dịch này xảy ra trong khai báo lớp:
class Wibble[+T] {
var some: T = _ //COMPILER ERROR HERE!
}
Tôi sẽ đặt một câu hỏi riêng biệt ...
Câu hỏi này đã được trả lời hay vẫn còn mở? –
Tôi đã không nhận thấy câu trả lời của bạn khi tôi đi nghỉ mát ngay sau đó. Lấy làm tiếc. Tôi khá chắc chắn rằng tôi đã đọc rằng đã có "không có ký tự đại diện trong Scala". Đây có phải là trường hợp không? Tôi cho rằng nó không phải bây giờ ... –