gpt4 book ai didi

java - 将类文字作为交集类型返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:07 24 4
gpt4 key购买 nike

我有几个实现一些通用接口(interface)的枚举,我想从方法中返回类文字。但是我无法正确指定交集类型。请参阅下面说明问题的代码示例。

public class GenericsTest {    
interface Iface {
}

enum E1 implements Iface {
}

enum E2 implements Iface {
}

<E extends Enum<E> & Iface> Class<E> getEnum1() {
return E1.class; //ERROR incompatible types: java.lang.Class<GenericsTest.E1> cannot be converted to java.lang.Class<E>
}

Class<? extends Enum<?>> getEnum3() {
return E1.class; //OK
}

Class<? extends Iface> getEnum4() {
return E1.class; //OK
}

<E extends Enum<E> & Iface> void enumParam(Class<E> p) {
enumParam(E1.class); //OK
}

}

#getEnum1 方法无法编译。有趣的是,它在 #enumParam 中用作参数值。如何指定交集类型以便能够从方法返回类文字?

最佳答案

方法getEnum1出于与此相同的原因而无法编译:

public <E> E foo() {
return "bar"; // Compile time error: Incompatible types E and String
}

看到了吗?只是因为类型参数 E最终可能是一个字符串,这并不意味着它兼容 String .可以将此函数称为 Integer i = x.<Integer>foo(); , 所以返回一个字符串在这里没有意义。

getEnum1是完全一样的。类型参数 E可以选择类型 E1 (这里的命名非常糟糕),但它并不意味着 E1始终与 E 兼容.考虑 E2 e2 = x.<E2>getEnum1(); .您可能想知道为什么编译器在尝试使用错误的类型参数调用它时不只是发出错误警报。问题是,E2满足类型约束,因此没有理由在那里显示错误。

那么如何让您的代码正常工作呢?

最简单(也可能是唯一)的方法就是去掉泛型:

Class<E1> getEnum1() {
return E1.class;
}

如果你不想暴露具体类型 E1在这里,你运气不好。您所能做的就是将通用功能提取到接口(interface),并返回该类型。

关于java - 将类文字作为交集类型返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39166892/

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