gpt4 book ai didi

java - 泛型类型 : Cannot specify sub-type when using . 类与泛型类型不兼容

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:58 26 4
gpt4 key购买 nike

有很多与 Java 泛型相关的线程,我无法弄清楚为什么 Java 不支持它(或者,我需要做什么才能使其工作)。

public interface Thinger<T> {

Class<? extends Thinger<T>> getThingers();
}

public class Thingy<Qwerty> implements Thinger<String> {

@Override
public Class<? extends Thinger<String>> getThingers() {
return Thingx.class;
}
}

public class Thingx implements Thinger<String> {

@Override
public Class<? extends Thinger<String>> getThingers() {
return Thingy.class; // Incompatible types error
}
}

我可以通过两种方式修复编译错误,但这两种方式最终都会丢失我想要保留的某种类型的输入信息!

选项 1

删除通用的QwertyThingy<Qwerty> .

public class Thingy implements Thinger<String> {
..
// Ends up fixing the compile error in Thingx

选项 2

删除通用的StringClass<? extends Thinger<String>>

public class Thingx implements Thinger<String> {

@Override
public Class<? extends Thinger> getThingers() {
return Thingy.class; // Fixed!

最佳答案

Thingy.class返回 Class<Thingy>哪里Thingy是原始类型,因为它没有指定 Qwerty 的值。因为它是原始类型,所以编译器只知道 Thingy实现Thinger ,而不是 Thinger<String> ,因为该信息由于类型删除而丢失。

要修复此问题,您可以将 Class<Thingy> 转换为到 Class<? extends Thinger>使用 Class#asSubclass ,然后编译器允许隐式转换为 Thinger<String> .

return Thingy.class.asSubclass(Thinger.class);

测试时不会产生编译器或运行时错误:

Class<? extends Thinger<String>> c = new Thingx().getThingers();
System.out.println(c.getGenericInterfaces()[0]);

输出是:

Thinger<java.lang.String>

关于java - 泛型类型 : Cannot specify sub-type when using . 类与泛型类型不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39177307/

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