我看到一些代码使用Object
而不是通配符(?
)作为泛型类的参数。这导致客户端代码中的显式强制转换。有什么好处,分别是这种方法的权衡取舍?
答案 0 :(得分:6)
使用Object
作为类型参数与使用?
完全不同。请参阅以下两种方法:
void frobnicate1(List<?> someList);
void frobnicate2(List<Object> someList);
两者都会收到List
,当他们从Object
获取元素时,他们都会收到List
,但 frobnicate1
可以调用一个List<String>
甚至一个List<?>
,而frobnicate2
只能 才能List<Object>
(或null
)。
请注意,使用通配符类型参数(?
)无法实例化参数化类型。
以下无效:
List<?> someList = new ArrayList<?>();
您必须使用Object
(或任何其他非通配符类型):
List<?> someList = new ArrayList<Object>();
并且不要担心显式转换:JVM可以优化它(也可能会),因为任何参考值到Object
的转换将始终成功。
答案 1 :(得分:3)
我觉得以这种方式记住它很有帮助:
列表与LT;对象&gt; =一个列表,其中每个元素都被视为Object
列表与LT;?&GT; =一个列表,其中每个元素都被视为Object