(); public final @NotNu-6ren">
gpt4 book ai didi

java - 是什么导致了这个 "unchecked cast"警告?

转载 作者:行者123 更新时间:2023-12-03 23:58:35 26 4
gpt4 key购买 nike

在java中,我已经做了(并且正在使用没有问题),这个方法:

private final HashMap<String, Object> data = new HashMap<>();

public final @NotNull <clazz> Collection<clazz> getCollection(@NotNull String key, @NotNull Object clazz) {
Object object = this.data.get(key);
if (object instanceof Collection) {
Collection<?> collection = (Collection<?>) object;
for (Object o : collection) {
if (o.getClass().equals(clazz)) {
return (Collection<clazz>) collection;
}
break;
}
}
return Collections.emptyList();
}

具体来说,return (Collection<clazz>) collection; 行正在产生警告:

  • Unchecked cast: 'java.util.Collection<capture<?>>' to 'java.util.Collection<clazz>'

在适当的情况下诚实:大约一年前,在我开始学习编码后不久,我出于需要即兴创作了这种方法。不幸的是,即使是现在,我仍然不明白 <clazz> 到底是什么。我放在那里的东西是做什么的,它为什么起作用以及它是如何起作用的。

从这个意义上说:我希望了解 - 当然,不要被提供删除警告信息的解决方案。 (在这篇文章之前,我完全没有使用 @SuppressWarnings("unchecked")。)

/编辑:

在阅读了到目前为止的回复之后,我正在理解为什么会产生这个警告。

现在,对于应该解决问题的理论解决方法:

    public final @NotNull <T> Collection<T> getCollection(@NotNull String key, @NotNull Class<T> dataType) {
Object object = this.data.get(key);
Collection<T> r = new ArrayList<>();
if (object instanceof Collection) {
Collection<?> collection = (Collection<?>) object;
for (Object o : collection) {
if (o.getClass().equals(dataType)) {
r.add((T) o);
}
}
}
return r;
}

但是现在 r.add((T) o); 行正在产生相同的警告。一定有比o.getClass().equals(dataType)更好的条件这将使IDE理解。 (顺便说一下,IntelliJ 社区版)

最佳答案

有两个clazz这里的变量:第一个是方法的第二个参数,另一个是类型参数<clazz>的方法。我强烈建议重命名第二个以避免这种歧义(通常类型参数以单个大写字母命名)。

编译器显示此警告的原因是它不能保证(即在编译时检查)强制转换是安全的。没有任何东西可以保证您对元素类型进行检查的参数类型与类型参数相同。所以你可以有一个Integer作为参数传递,而您返回 Collection<String>通过使用 String 调用方法类型参数:

data.put("a", List.of(1, 2));

Collection<String> collection = getCollection("a", Integer.class);
String first = collection.stream().findAny().get(); // ClassCastException at runtime

您可以通过让类使用相同的类型参数来稍微改善这一点:

public final @NotNull <T> Collection<T> getCollection(@NotNull String key, @NotNull Class<T> clazz) {
Collection<?> object = data.get(key);
if (object instanceof Collection) {
Collection<?> collection = (Collection<?>) object;
for (Object o : collection) {
if (o.getClass().equals(clazz)) {
return (Collection<T>) collection;
}
break;
}
}
return Collections.emptyList();
}

但此警告仍将保留,因为您需要确保所有集合元素的类型均为 T。在运行时:

data.put("a", List.of("x", 2));

Collection<String> collection = SOTest.getCollection("a", String.class);
for(String s : collection) {
System.out.println(s); // second element will still cause ClassCastException
}

关于java - 是什么导致了这个 "unchecked cast"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66007075/

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