您省略的错误消息不是无关的细节。关于“我也希望 Scala 对此提供一些支持”,您也可以选择通过阅读错误消息来参与该过程,如果您不理解它们,请在提问时将它们包括在内,而不是模糊地解释它们。
错误消息,它们很重要。即使他们感到困惑。特别是当他们感到困惑时。
这是 2.8.1 中的错误:
a.scala:2: error: overriding method getScore in trait Solution of type ()Score[_ <: Score];
method getScore has incompatible type
def getScore: Score[_] = null
^
one error found
这是主干的错误:
a.scala:2: error: overriding method getScore in trait Solution of type ()Score[_ <: AnyRef];
method getScore has incompatible type
def getScore: Score[_] = null
^
one error found
那里有一个关键的区别,这有助于为什么当我按照错误消息的指示这样做时它与主干一起工作。
// this compiles with 2.9, but not with 2.8
class MySolution extends Solution {
def getScore: Score[_ <: AnyRef] = null
}
在 Java 源代码中使用原始类型 Score 的方式(在一个位置作为类型构造函数,但在另一个位置具有隐含的存在类型参数,第二个外观限制第一个),它可以在任何地方工作,这是一个奇迹。您不想知道适应这种事情已经对编译器造成了多大的损害。确实,如果原始类型可以正常工作会很好,但很多事情都会很好。有些事情是不可能的,有些事情是不可取的,有些事情需要少数人付出太多的努力才能让船继续航行。原始类型赢得三冠王。