用有界继承覆盖Scala中Java类的抽象方法

时间:2016-11-17 10:35:58

标签: java scala generics inheritance

我想在Scala中实现的库中有一个抽象类,它具有带有限继承的抽象复制方法,如下所示:

// Java code
public abstract class Base {
      public abstract <T extends Base> T copy();
}

当我用Java创建一个类时,它工作正常,即

public class FromBase extends Base {
     @Override
     @SuppressWarnings("unchecked")
     public FromBase copy();
}

但如果我尝试在Scala中执行此操作,则下面的内容为method 'copy' overrides nothing

class FromBase extends Base {
    override def copy(): FromBase = new FromBase()
}

以下IDE建议的工作但需要调用类型v.copy[FromBase]()才能工作:

class FromBase extends Base {
    override def copy[T <: Tuple](): T = (new FromBase).asInstanceOf[T] 
}

由于可以从Java调用该方法,因此我需要一个没有泛型的副本来工作,就像在Java示例中一样。

1 个答案:

答案 0 :(得分:2)

Base.copy声明表示它可以返回要求Base子类型。写

完全有效
Base base = new FromBase;
AnotherBaseSubclass base2 = base.copy();
// same as AnotherBaseSubclass base2 = base.<AnotherBaseSubclass>copy();

如果FromBase.copy实际返回类型为FromBase,这显然无法奏效。 所以&#34;警告&#34;你压抑应该是一个错误,Scala不允许它。

T实际上需要Base,而不是copy。如果你解决了这个问题:

// Java code
public abstract class Base<T extends Base> {
      public abstract T copy();
}

// Scala
class FromBase extends Base[FromBase] {
    override def copy() = new FromBase
}

它将编译并且不需要任何强制转换或抑制警告。