我在一个库中有一个抽象类,我想在 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 中执行此操作,下面会给出方法“copy”不覆盖任何内容
:
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 示例中所示。
最佳答案
Base.copy
的声明表示它可以返回Base
所要求的任何子类型。写起来完全有效
Base base = new FromBase;
AnotherBaseSubclass base2 = base.copy();
// same as AnotherBaseSubclass base2 = base.<AnotherBaseSubclass>copy();
如果 FromBase.copy
实际返回类型是 FromBase
,这显然不起作用。
因此,您抑制的“警告”应该是一个错误,而 Scala 不允许这样做。
很可能您实际上需要 Base
上的 T
,而不是 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
}
它将编译,不需要任何强制转换或抑制警告。
关于java - 使用有界继承重写 Scala 中 Java 类的抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40652564/