gpt4 book ai didi

java - 常量特定类主体的非泛型 getClass() 方法是通过设计还是对 Java 的监督?

转载 作者:行者123 更新时间:2023-11-30 09:42:17 25 4
gpt4 key购买 nike

以下代码的注释指示两行相似的代码,其中一行编译,另一行不编译。

public class TestGenericCollections extends TestCase {
List<Key<? extends Enum<?>>> keyList;

public TestGenericCollections() {
keyList = Lists.newArrayList();
}

public <T extends Enum<T>> void addEnum(List<T> values) {
Preconditions.checkArgument(values.size() > 0);
// Signature of Key.get():
// public static <T> Key<T> get(Class<T> type)

// the following line compiles without warning or error
keyList.add(Key.get(values.get(0).getDeclaringClass()));
// The following line fails to compile with this error message in Eclipse:
// The method add(Key<? extends Enum<?>>) in the type List<Key<? extends Enum<?>>>
// is not applicable for the arguments (Key<capture#1-of ? extends Enum>)
keyList.add(Key.get(values.get(0).getClass()));
}

错误信息很有趣。请注意,没有 Enum<?> , 它是原始的 Enum .这意味着任何通用方法/集合/等。如果想要对枚举的匿名常量特定类主体类型进行操作,则必须放弃泛型并使用注释 @SuppressWarnings("rawtypes") 如果他们想避免编译器警告。这就是为什么该行不会编译但上面的行会编译的原因。 Enum<T>.GetDeclaringClass()正确返回泛型类型,但编译器为每个 Enum 创建了匿名常量特定类值常数不。

那么,原理是什么?这是疏忽还是语言设计者没有更改 Enum 的匿名常量特定类主体上的签名的原因?的 getClass()方法像对 Object.getClass() 那样通用Java 泛型是什么时候添加到语言中的?

最佳答案

您的建议可能会有用。但是我不会称之为疏忽。

getClass()的签名在语言规范中明确定义,需要特殊的编译器处理。

为了得到你想要的,语言规范需要另一个枚举异常(exception)。附加规则并不简单。用例可能不够普遍,不足以证明成本合理。

--

如果getClass()返回 Class<? extends X>而不是 Class<? extends |X|> ,在大多数用例中(如您的示例),它会更有用。这在理论上是不正确的,但实际上它在直观的使用中是安全的。我们可以定义这样一个 getClass()我们自己

@SuppressWarnings("unchecked")
static public <T> Class<? extends T> getClass(T obj)
{
return (Class<? extends T>)obj.getClass();
}


// compiles
keyList.add(Key.get(getClass(values.get(0))));

关于java - 常量特定类主体的非泛型 getClass() 方法是通过设计还是对 Java 的监督?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8754190/

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