This question already has answers here:
What is a raw type and why shouldn't we use it?
                                
                                    (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 {


我期望方法getOwnerNamesTBag类型无关。如果您可以回答以下问题之一,将很有帮助:


为什么会收到警告?
除了抑制它外,我还能做什么?

最佳答案

您在程序中使用所谓的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