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。
当我发现以下问题时,我正在探索列表和通用性
如果我们有这个对象(编译时出现任何错误或警告):
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。