java - 使用有界继承重写 Scala 中 Java 类的抽象方法

标签 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 中执行此操作,下面会给出方法“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/

相关文章:

java - 使用反射与 java.math.BigInteger 交互时,我会遇到哪些问题?

c# - 如何编写通用扩展方法以使用 HashSet.AddRange() 将 List 转换为 HashSet?

Java集测试

java - 在java泛型类中将Integer转换为int

scala - 检索将分配给 Scala 宏调用的值的名称

java - 使用 Jackson ObjectMapper 反序列化或序列化任何类型的对象并处理异常

java - 该方法未定义类型 Class<capture#3-of ?扩展命令>

java - 检查 Field[] 是否包含名称为 XXX 的字段

java - spring-cloud 和 spring-cloud-gcp 有通用的 BOM 文件吗?

python - Scala 相当于 Python 生成器?