【发布时间】:2012-01-24 20:06:36
【问题描述】:
我有一份我今天发现的问题的简短列表。 我是 scala 新手,因此我的问题可能是微不足道的。
假设我们有这样一个类:
abstract class A[+T] { def foo[S >: T](x: S): String }
我们应该为有用的子类提供一些功能。
1) 我的第一次尝试是这样的:
class B extends A[String] { def foo(x: String) = x }
但 scalac 编译器不同意消息:
xxx@yyy:~$ scalac covariant.scala
covariant.scala:3: error: class B needs to be abstract, since method foo in class A of type [S >: String](x: S)String is not defined
class B extends A[String] { def foo(x: String) = x }
^
首先,为什么scalac没有推断出foo的泛型类型参数,它真的是一个复杂的任务吗?
2) 下一次尝试看起来更好,应该被接受,我认为:
class B extends A[String] { def foo[String](x: String) = x }
但现在编译器让我大开眼界:
covariant.scala:3: error: type mismatch;
found : String(in method foo)
required: java.lang.String
class B extends A[String] { def foo[String](x: String) = x }
^
String 和 java.lang.String 的不匹配似乎是个问题。这是第二个问题:这真的是一个错误吗?
3) 最后我决定将 String 类型切换为 Date 作为参数:
import java.util.Date
class B extends A[Date] { def foo[Date](x: Date) = x.toString }
它已被编译,没有任何警告。所以最后一个问题是:为什么?我的第二个和第三个 sn-ps 有什么区别?
顺便说一下,scalac版本是2.9.1.final
【问题讨论】:
标签: generics scala inheritance