当前位置: 首页 > 知识库问答 >
问题:

Java泛型编译错误“不兼容类型”(在gradle中,但不在IDE中)

司马德水
2023-03-14

在下面的情况下,我在理解Java泛型的行为时遇到了问题。

具有一些参数化接口iPace 和一些类上的方法,这些类返回扩展该接口的类, >类 getClazz() gradle、1.8Oracle JDK、OSX和Linux生成java编译错误,但不是由Eclipse IDE中的Eclipse编译器生成的(它也可以在Eclipse RCP OSGi运行时下运行),实现如下:

public class Whatever {
  public interface IFace<T> {}

  @SuppressWarnings("unchecked")
  protected <C extends IFace<?>> Class<C> getClazz() {
    return (Class<C>) IFace.class;
  }
}

./Gradlew build

:compileJava
/Users/user/src/test/src/main/java/Whatever.java:6: error: incompatible types: Class<IFace> cannot be converted to Class<C>
    return (Class<C>) IFace.class;
                           ^
  where C is a type-variable:
    C extends IFace<?> declared in method <C>getClazz()
1 error
:compileJava FAILED

最简单的修复是删除方法签名中泛型定义的一部分。以下编译没有问题,但依赖于原始类型:

protected Class<? extends IFace> getClazz() {
  return IFace.class;
}

为什么这个编译而上面不编译?有没有一种方法可以避免使用原始类型?

共有1个答案

柏正平
2023-03-14

它不编译,因为它的类型不正确。

考虑以下几点:

class Something implements IFace<String> {}
Class<Something> clazz = new Whatever().getClazz();
Something sth = clazz.newInstance();

如果使用instantiationexception,这将失败,因为clazziface.class,因此无法实例化;它不是something.class,可以实例化。

如果上面的clazz.newinstance()调用成功了(编译器不知道它不会成功),则返回的值将是iface的实例,而不是something,因此赋值将以ClassCastException失败。

您可以通过将iface更改为可实例化来演示这一点:

class IFace<T> {}
class Something extends IFace<String> {}
Class<Something> clazz = new Whatever().getClazz();
Something sth = clazz.newInstance();  // ClassCastException

IdeOne演示

 类似资料:
  • 问题内容: 我在写一些代码,遇到编译错误。这就是我所拥有的: 我以为使用继承时没有正确声明泛型,所以我检查了Oracle的教程,他们在其中编写 上面的声明使用相同的泛型类型,这是我在示例中要完成的工作。似乎假设from 与from 有所不同。否则,它应该能够 将 两者 合并并看到相同的类型。如何正确实现我要实现的目标? ( 即,某物的常量是某物的值,这是同一物的表达 ) 问题答案: 您的变量定义为

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

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

  • 问题内容: 我不得不发现我的项目中有Java代码,该代码可以在Eclipse中编译并正常运行,但是会在javac中引发编译错误。 一个完整的代码段: javac中的编译返回: 现在,此错误阻止在Maven中构建项目。由于Eclipse编译器具有更高的容忍度,因此我现在不得不假设代码段的定义和用法如上所述,静态方法不是有效的Java吗? 问题答案: 似乎Sun的1.6 JDK无法推断正确的类型。以下

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

  • 问题内容: 我知道过去有一些关于在Eclipse中编译但不能在命令行中编译的问题,但是我还无法找到解决问题的答案。 特别是,我认为我可以设置eclipse以使用我的系统编译器,但这仍然不能解决问题。 我目前正在检查以下内容:“首选项-> Java->已安装的JRE”。 它仅包含一个JRE,这是我的系统之一。 这是问题的细节 我有一个Java通用类,将Enum类型作为参数,如下所示: 我在类中的某个