Object vs的权衡取舍是什么?在通用参数?

时间:2011-05-05 08:10:21

标签: java generics

我看到一些代码使用Object而不是通配符(?)作为泛型类的参数。这导致客户端代码中的显式强制转换。有什么好处,分别是这种方法的权衡取舍?

2 个答案:

答案 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

的特定但未知的子类