Следуя этому вопросу, может кто-нибудь объяснить следующее в Scala:
class Slot[+T] (var some: T) {
// DOES NOT COMPILE
// "COVARIANT parameter in CONTRAVARIANT position"
}
Я понимаю различие между +T
и T
в объявлении типа (он компилируется, если я использую T
)., Но как же на самом деле написать класс, который является ковариантным в своем параметре типа, не прибегая к созданию вещи, не подверженной параметрам? Как я могу убедиться, что следующее может быть создано только с экземпляром T
?
class Slot[+T] (var some: Object){
def get() = { some.asInstanceOf[T] }
}
РЕДАКТИРОВАТЬ - теперь это произошло следующим образом:
abstract class _Slot[+T, V <: T] (var some: V) {
def getT() = { some }
}
Это все хорошо, но теперь у меня есть два типа параметров, где я только хочу. Я перепрошу вопрос таким образом:
Как я могу написать неизменяемый класс Slot
, который является ковариантным по своему типу?
РЕДАКТИРОВАТЬ 2: Ду! Я использовал var
, а не val
. Следующее - это то, что я хотел:
class Slot[+T] (val some: T) {
}