相关疑难解决方法(0)

Scala编译器如何处理具体的特征方法?

如果我有以下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中是合法的,显然也是如此.

java scala traits

10
推荐指数
1
解决办法
687
查看次数

标签 统计

java ×1

scala ×1

traits ×1