java - 另一个 Java 泛型 "incompatible types"编译错误

标签 java generics inheritance

我正在编写一些代码并遇到了 incompatible types编译错误。 这就是我所拥有的:

public interface Expression<T> {
    int getArity();
    T evaluate();
}
<小时/>
public abstract class Value<T> implements Expression<T> {
    @Override
    public final int getArity() { return 0; }
}
<小时/>
public final class Constant<T> extends Value<T> {
    private final T value;

    /** Parameter constructor of objects of class Constant. */
    public Constant(T val) {
        value = val;
    }

    /** Copy constructor of objects of class Constant. */
    private Constant(Constant instance) {
        value = instance.evaluate();    // Error here.
    }

    @Override
    public T evaluate() { return value; }
}

我认为在使用继承时我没有正确声明泛型,所以我检查了 Oracle's tutorial ,他们在其中写道

interface PayloadList<E,P> extends List<E>

上面的声明使用相同的泛型类型 E ,这就是我想要在我的示例中完成的任务。似乎假设 T来自Constant<T>Value<T> 中的不同。否则它应该能够合并两者 T并看到它是同一类型。 我怎样才能正确实现我想要实现的目标?

(即某事物的常量是某事物的值,它是同一事物的表达式)

最佳答案

您的instance变量定义为 Constant instance;

如果您没有在变量上指定泛型,则泛型类型将自动为 Object ,类型 ObjectT 不同.

你必须使用

private Constant(Constant<T> instance)

而不是

private Constant(Constant instance)

因为这与 private Constant(Constant<Object> instance) 相同

关于java - 另一个 Java 泛型 "incompatible types"编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56310323/

相关文章:

java - iframe 在 org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:369) 导致 ClientAbortException : java. io.IOException

java - 如何在我的应用程序中获取 facebook 用户的连接?

c# - 有没有办法创建通用的 Action 或 Func

java - 使用 Enum 作为 Map 中的类型时的奇怪行为

带有抽象方法的Java继承

java从字符串变量中获取最后一行(最快的方法)

java - 在Java中打开URL获取内容

java - 在这种情况下扩展 List<E> 有用吗?

angular - 扩展 Angular Material2 MdTab 组件

c# - 重载、泛型和类型约束 : method resolution