如果我有以下Scala类:
abstract class MyOrdered extends Ordered[MyOrdered] {
def id: Int
def compare(that : MyOrdered) : Int =
if (that==null) 1 else (id-that.id)
}
Run Code Online (Sandbox Code Playgroud)
然后我只需要在Scala中定义id方法来获得具体的类.但是如果我尝试用Java扩展它,编译器会说Ordered的所有具体方法都缺失了.那么,这是否意味着Scala编译器只在具体的Scala类中实现了Ordered的具体方法?
这看起来非常浪费,因为我可以有几十个实现MyOrdered的具体类,并且它们都会得到相同代码的副本,实际上将它直接放在基类MyOrdered中就足够了.此外,这使得创建Java友好的Scala API变得非常困难.有没有办法强制Scala编译器将方法定义放在应该这样做的地方,除了通过使用虚方法实现使类具体化?
甚至更有趣的是在Scala特征中声明一个具体的方法final.在这种情况下,它仍然没有在扩展特征的抽象Scala类中实现,但它不能在扩展抽象Scala类的Java类中实现,因为它被标记为final.这绝对是一个编译器错误.最终的抽象方法毫无意义,即使它们在JVM中是合法的,显然也是如此.