This question already has answers here:
What is a raw type and why shouldn't we use it?
(15个答案)
4年前关闭。
为什么以下代码在尝试编译时会引起警告?
Bag.java:
BagException.java:
即使声明该方法返回
这些更改使警告消失了,这确实很奇怪:
在
在界面中使用
我期望方法
为什么会收到警告?
除了抑制它外,我还能做什么?
不会编译,因为原始
(15个答案)
4年前关闭。
为什么以下代码在尝试编译时会引起警告?
Bag.java:
import java.util.List;
public interface Bag<T> {
public List<String> getOwnerNames();
}
BagException.java:
public class BagException extends Exception {
public BagException(Bag badBag) {
super(buildMessage(badBag));
}
private static String buildMessage(Bag badBag) {
// BagException.java:10: warning: [unchecked] unchecked conversion
// List<String> owners = badBag.getOwnerNames();
// ^
// required: List<String>
// found: List
List<String> owners = badBag.getOwnerNames();
return "Something went wrong with the bag of " + String.join(", ", owners);
}
}
即使声明该方法返回
List<String> owners = badBag.getOwnerNames()
,buildMessage
中的List<String>
也会引起警告。这些更改使警告消失了,这确实很奇怪:
在
Bag<Integer> badBag
的参数中使用Bag badBag
代替buildMessage
:private static String buildMessage(Bag<Integer> badBag) {
在界面中使用
Bag
代替Bag<T>
:public interface Bag {
我期望方法
getOwnerNames
与T
的Bag
类型无关。如果您可以回答以下问题之一,将很有帮助:为什么会收到警告?
除了抑制它外,我还能做什么?
最佳答案
您在程序中使用所谓的raw type,是通过声明Bag
而不为类的type参数指定参数。 Java编译器javac处理原始类型,例如它不包含通用类型信息。这涉及作为原始类型的一部分的任何泛型类型,甚至包括不包含原始类型的类型变量的此类类型。 (在您的情况下,List<String>
被视为原始的List
。)
因此,原始引用的Bag
中的所有通用类型均被视为擦除。您还可以观察到
String value = badBag.getOwnerNames().get(0);
不会编译,因为原始
Bag
返回原始List
而不是List<String>
。您收到的警告表明您将这样的原始列表分配给通用的List<String>
会导致heap pollution的事实。关于java - 使用泛型返回列表的接口(interface)会引发警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32718081/
10-11 20:06