【发布时间】:2014-09-29 21:36:18
【问题描述】:
我正在阅读http://oldfashionedsoftware.com/2008/08/26/variance-basics-in-java-and-scala/
正在查看代码
class CoVar[+T](param1: T) {
def method1(param2: T) = { }
def method2: T = { param1 }
def method3: List[T] = { List[T](param1) }
def method4[U >: T]: List[U] = { List[U](param1) }
val val1: T = method2
val val2: Any = param1
var var1: T = method2
var var2: Any = param1
}
如果我有一个
val covar1 = new CoVar(new Car)
val covar2: CoVar[Vehicle] = covar1 //completely legal with covariant
现在,让我们来看看方法
- method1 - 我不明白为什么它不能编译,这是我的主要问题
- method2 - param1 是一辆汽车,method2 返回一个 Vehicle 很好,因为 Car 是一辆 Vehicle
- method3 - 因为 List[Vehicle] 返回并且 Car 是 Vehicle 这很好
- var1 - 我相信同样的问题,而且差别不大
我认为使用 method1(param: Vehicle) 可以,因为我可以通过一辆新车就好了,或者一辆新车就好了
但是原始的 CoVar 类没有编译,因为它说 method1 是逆变位置。我认为逆变意味着我可以传入一个
现在,我们用 ContraVar 和方法 1 遍历它
class ContraVar[-T](param1: T) {
def method1(param2: T) = { }
val val2: Any = param1
var var2: Any = param1
}
val temp1 = new ContraVar(new Car)
val temp2: ContraVar[Ford] = temp1
temp2.method1(new Ford)
temp2.method1(new FordMustang)
temp2.method1(new Car) //fails to compile(good)
效果很好。有人可以解释一下为什么方法1会在CoVar上中断吗?也许我走上了完全错误的道路,让方法 1 编译得很好会出现什么问题?
谢谢, 院长
【问题讨论】:
标签: scala scala-2.10