gpt4 book ai didi

Java 泛型谜题——获取泛型对象的类/类型,方便后续确定类型

转载 作者:行者123 更新时间:2023-11-30 06:14:24 24 4
gpt4 key购买 nike

看看这个简短的类(class)。

它有什么作用?它是一个 HashMap,其中键是一个 Class 对象,值是一个 Hashmap,其键和值的类型由 Class 对象定义。

假设您想要一个方法 add(K obj),这将是一个方便的方法。你为什么要强制用户键入 add(Person.class, personInstance),而你也可以让他直接将实例本身传递给你 - 代码应该能够获取对象的类并将实例放在键下对象的类别。但我不能。 add(K obj) 便捷方法无法编译:

public class TypedHashmap extends HashMap<Class, HashMap> {

public <K> HashMap<K, K> getHashMap(Class<K> type) {
return (HashMap<K, K>) getOrDefault(type, new HashMap<K, K>());
}

public <K> void add(K obj, Class<K> type) {
HashMap<K, K> toModify = getHashMap(type);
toModify.put(obj, obj);
}

public <K> void add(K obj) {
add(obj, obj.getClass());
}
}

编译错误:

enter image description here

我可以看到 Java 不确定 obj.getClass() 类型。但我不明白为什么。是因为它不能确保这个类实际上不是扩展 K 的东西吗?这里有什么问题?这可以以某种方式解决吗?

最佳答案

泛型是确保类型安全的工具。

您设计 API 的方式类型安全到此级别,这就是您收到此错误的原因。

public <K> void add(K obj) {
add(obj, (Class<K>) obj.getClass());
}

是明确表示您无法确保类型安全的方法。或者只是做一个

public void add(Object obj) {
add(obj, (Class<Object>) obj.getClass());
}

这将为您提供相同级别的类型安全(无)。

如果您想要一个更简洁的解决方案(不强制转换更简单的 add 函数),您还必须修改其他 add 函数。

public <K> void add(K obj, Class<? super K> type) {
HashMap<K, K> toModify = getHashMap(type);
toModify.put(obj, obj);
}

public void add(Object obj) {
add(obj, obj.getClass());
}

但最终我相信您正在实现反模式

问题是这样的:

Number a = new Integer(3);
map.add(a);
map.getHashMap(Number.class).contains(a);

产生错误。 Number 映射中的 Integer 。因为您的 map 不支持子类型和继承。

向列表添加一个Integer 对象。但除非我知道哪个

关于Java 泛型谜题——获取泛型对象的类/类型,方便后续确定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30406707/

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