Tag: 特征

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

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

如何实现有效的Java特性?

如果这是不合适的,请告诉我(特别是Programmers.SE或者某些东西对于这个问题会更好。) 好的。 所以我有很多’特征’,我目前正在表达为接口。 我们称之为“可更新”和“可破坏”。 将它们表示为接口有一个缺点,我无法在所有“可破坏”组件之间共享行为; 另一方面,将这些表示为抽象类意味着我不能混合和匹配而不将混合特征明确定义为另一个抽象类(“UpdateableAndDestructible”),而且这感觉就像滥用抽象类function一样。 但是,如果没有更清晰的方法来解决这个问题,我可能最终会这样做。 对于这个难题,纯Java解决方案有哪些选择? 我是否有可能描述共享行为,然后按照我认为合适的方式进行混合和匹配,而不必明确描述我将要使用的每个排列?

Scala特征 – 是否有相当于Java接口的公共静态字段?

在Java中: public interface Foo { public static final int Bar = 0; } 在Scala中,我如何创建一个具有Bar的trait Foo ,我可以访问它: Foo.Bar ?

java traits还是mixins模式?

有没有办法在java中模拟mixins或traits? 基本上,我需要一种方法来进行多重inheritance,这样我就可以将常用的业务逻辑添加到几个类中