我想在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示例中一样。
答案 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
}
它将编译并且不需要任何强制转换或抑制警告。