java 如何处理使用原始类型列表的通用性和多态性

how does java handle using genericity and polymorphism with rawtype list

当我发现以下问题时,我正在探索列表和通用性

如果我们有这个对象(编译时出现任何错误或警告):

class Thing<TYPE>{
   void add(List<TYPE> ls){...}

   void add(TYPE ls){...}
}

然后我们做:

Thing<List> thing = new Thing<List>(); //warn about rawtypes but compile
List list=new ArrayList(); //same thing here
thing.add(list); //warn about unsafe cast but compile

java如何决定调用哪个方法?

我知道出于多种原因,这可能是要不惜一切代价避免的事情,但由于它仍然可以编译(至少 eclipse 说它可以),我仍然对它的行为方式感到好奇

Java 选择最具体的方法重载。

在这种情况下,您正在调用一个名为 add 的方法,因此编译器有两个选择:add(List)add(Object)(参数类型是原始的,因为 thing 是原始类型)。

如果您传递原始类型的 List,则匹配 add(List)add(Object)add(List)add(Object) 更具体,因为有 Object 不是 List,但没有 List 不是 [=19] =]s.

所以,它选择add(List)


不过,这里更值得欣赏的是that you shouldn't use raw types if at all possible