java - 这段处理泛型的 Java 代码有什么问题?

标签 java generics

interface Addable<E> {
    public E add(E x);
    public E sub(E y);
    public E zero();
}

class SumSet<E extends Addable> implements Set<E> {

    private E element;

    public SumSet(E element) {
        this.element = element;
    }

    public E getSum() {
        return element.add(element.zero());
    }
}

element.add() 似乎没有返回一个 E extends Addable,而是一个 Object。这是为什么?这与 Java 在运行时不知道对象类型到底是什么,所以它只是假设它们是对象(因此需要强制转换)有什么关系吗?

谢谢

最佳答案

尝试:

class SumSet<E extends Addable<E>> implements Set<E> {

我不知道这是否正是您的意思,但基本上问题是您在 SumSet 的声明中使用 Addable 作为原始类型。这剥离了所有通用参数类型并使 AddableSumSet 中显示为:

interface Addable {
  Object add(Object x);
  Object sub(Object y);
  Object zero();
}

显然 Object 不是 E,因此会出现错误。参见 What is the raw type?来自 Java 泛型常见问题解答。

旁注 public 在接口(interface)定义中的方法上是不必要的。

关于java - 这段处理泛型的 Java 代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2657131/

相关文章:

java - 将字符串解析为 Java 方法

java - java 中的 Random.nextBytes(bytes[]) 行为

java - 类型与有界通配符不匹配? super 类型

java - 如何在 Eclipse 中运行通用参数化 JUnit 测试?

java - 如何直接将 XML 中的字符串放入 java 数组中

C# 通用对象函数指针,相同地址?

c# - 如何将数据强制转换为方法约束中指定的泛型?

java - 我的通用 EnumSet 方法 - 无法访问 Enum.values()

scala - 如何在 Scala 中正确声明协变类型?

java - Log4j 2 根记录器覆盖一切?