当前位置: 首页 > 面试题库 >

另一个Java泛型“不兼容类型”编译错误

孔城
2023-03-14
问题内容

我在写一些代码,遇到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的教程,他们在其中编写

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

上面的声明使用相同的泛型类型E,这是我在示例中要完成的工作。似乎假设Tfrom 与from
Constant<T>有所不同Value<T>。否则,它应该能够 两者 合并T并看到相同的类型。如何正确实现我要实现的目标?

即,某物的常量是某物的值,这是同一物的表达


问题答案:

您的instance变量定义为Constant instance;

如果您未在变量中指定通用名称,则通用类型将自动为Object,并且类型Object与不同T

你必须用

private Constant(Constant<T> instance)

代替

private Constant(Constant instance)

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



 类似资料:
  • 在stackoverflow中还没有讨论的情况下,我遇到了“不兼容类型”编译器错误(例如,为什么这个通用java代码不能编译?)。 我的期望很简单--我调用的是一个模板化方法,它不使用包含类的任何“泛型”类,因此它应该从方法参数中提取模板参数的类型,并且在所有情况下都应该编译--但我得到了“不兼容类型”编译器错误。 我注意到解决这个问题的奇怪方法--在方法参数中向泛型datatype添加“<?ex

  • 在下面的情况下,我在理解Java泛型的行为时遇到了问题。 具有一些参数化接口和一些类上的方法,这些类返回扩展该接口的类,由、1.8Oracle JDK、OSX和Linux生成java编译错误,但不是由Eclipse IDE中的Eclipse编译器生成的(它也可以在Eclipse RCP OSGi运行时下运行),实现如下: ./Gradlew build 最简单的修复是删除方法签名中泛型定义的一部分

  • 我定义jackoson序列化器并将其添加到java类中,如下所示: 编译器出现以下错误: 注释的定义为: 如果我从ReportFilterDeserializer中删除泛型attibute,它将通过编译。我不明白编辑为什么抱怨。

  • 我在抽象课上有以下内容... 还有另一个类,它继承了这个类... 当我从主类执行以下调用时,我收到一个错误... 我的问题是..为什么会发生这种情况?我的getEntityById不是返回T型的东西,在这种情况下应该是产品吗? 我在 Netbeans 中工作,编译时未显示任何错误。 感谢您的帮助=)

  • 在处理一些旧代码时,我偶然发现了一个问题,用lambda表达式或方法引用替换了几个匿名类。这个问题有点难以用语言来解释,但我会尽我所能,下面我还添加了一个简短的例子,尽我所能来说明我的问题。 我的示例包括。。。 > 一个函数接口,GenericListener,它接受类型参数V并具有单个方法“GenericCallback(V GenericValue)”。 一个类,CallbackProduce

  • 我是一名java初学者,我正在阅读“Java初学者指南”这本书和泛型的主题。作者创建了以下泛型类: 在这种情况下,类型参数必须是Number或Number的子类。 作者说,如果我们添加一个新方法来检查存储在两个通用对象中的数值绝对值,如下所示: 用它写的解释是: 这里,使用标准方法Math.abs()获取每个数字的绝对值,然后进行数值比较,这种尝试的麻烦在于,它只会对类型与调用对象相同的其他Num