gpt4 book ai didi

java - 未经检查的分配警告

转载 作者:IT老高 更新时间:2023-10-28 21:19:26 25 4
gpt4 key购买 nike

我使用的是 Android Studio 1.1.0。

这不会导致警告:

public static class A {
public Map<Integer, String> getMap() {
return null;
}
}

public static class B {
public void processA(A a) {
Map<Integer, String> map = a.getMap();
}
}

但是让 A通用:

public static class A<T> {
public Map<Integer, String> getMap() {
return null;
}
}

还有这一行:

Map<Integer, String> map = a.getMap();

现在给你一个警告:"Unchecked assignment: 'java.util.Map to java.util.Map<java.lang.Integer, java.lang.String>' .

即使getMap 的签名完全独立于 T ,并且代码对于 Map 的类型是明确的包含。

我知道我可以通过重新实现 processA 来消除警告。如下:

public <T> void processA(A<T> a) {
Map<Integer, String> map = a.getMap();
}

但是我为什么要这样做呢? T 是什么意思在这里有什么关系吗?

所以,问题是 - 为什么类型删除不仅会影响 T (这是可以理解的 - 如果我传递 A 的实例, T 是未知的),还有像 <Integer, String> 这样的“硬编码”通用签名在这种情况下?

最佳答案

在第二种情况下:

public void processA(A a)

你所说的 A 是什么意思? ?意思是A<String>A<List<String>>或者是什么?您可能没有使用与 A 类型相关的任何内容,但是编译器不知道这个事实。对于编译器,只需 A是 panic 的迹象。

在你的情况下,因为你不需要知道 A 的类型,你可以:

public void processA(A<?> a) {
Map<Integer, String> map = a.getMap();
}

参数类型为 A<?>意味着,您并不特别关心 A 的类型并且只需指定一个通配符。对你来说,这意味着:A 的任何对象使用任何类型作为其泛型类型。实际上,这意味着您不知道类型。它没用,因为你不能做任何与 A 相关的事情以类型安全的方式作为 ?几乎可以是任何东西!

但是根据你的方法体,使用 A<?> 是很有意义的。因为在正文中没有你真正需要 A 类型的地方

关于java - 未经检查的分配警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28808053/

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