Class getCl-6ren">
gpt4 book ai didi

Java泛型编译错误 "incompatible types"(在gradle中但不在IDE中)

转载 作者:行者123 更新时间:2023-12-02 02:53:15 26 4
gpt4 key购买 nike

在以下情况下,我无法理解 Java 泛型的行为。

拥有一些参数化接口(interface),IFace<T> ,以及某个类上的方法,该方法返回扩展此接口(interface)的类,<C extends IFace<?>> Class<C> getClazz() gradle 产生 java 编译错误,1.8 Oracle JDK、OSX 和 Linux,但不是由 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;
}

为什么这个可以编译,而上面的不行?有没有办法避免使用原始类型?

最佳答案

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

考虑以下因素:

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

这会失败,并显示 InstantiationException ,因为clazzIFace.class ,因此无法实例化;这不是Something.class ,可以实例化。

Ideone demo

但是不可实例化并不是这里的相关点 - 对于 Class 来说很好。不可实例化 - 这是此代码尝试实例化它

Class<T>有一个方法T newInstance() ,它必须返回 T ,如果成功完成,否则抛出异常。

如果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 demo

通过引发这样的错误,编译器完全消除了陷入这种情况的可能性。

因此,请不要尝试使用原始类型来消除编译器的错误。它告诉你有问题,你应该正确解决它。修复的具体内容取决于您实际使用 Whatever.getClass() 的返回值。对于。

关于Java泛型编译错误 "incompatible types"(在gradle中但不在IDE中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43483205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com