0

在声明指向专用类型实例的类类型变量时,对象类型由实例化而不是声明确定。例子:

Object o = new ArrayList<>();
if(o instanceof ArrayList)
System.out.println("ArrayList it is!");

所以,ArrayList 只能使用 Object 的方法和属性,在这种情况下,即使我向下转型。ArrayList 怎么可能只实现部分实现,如果将类型设为 Object 不是更有意义吗?

另外,为什么可以在没有通用声明的情况下使用菱形推理?

4

3 回答 3

2

如果你和我通过电话交谈,那么你只与我的声音交流,但这并不意味着我的其余部分不复存在。您正在与该 ArrayList 作为一个对象进行交互,但它仍然具有 ArrayList 的所有部分——您只是没有与其他部分进行交互。

于 2013-04-27T22:27:28.207 回答
1
Object O = new ArrayList<>();

这个特定的代码说;“创建o该类型的引用变量,Object并将其指向ArrayList<>在堆上创建的新对象。”

instanceofjvm 运行代码时检查条件。即使引用变量是 type Object,在执行期间创建的实际对象也是ArrayList对象。

如果您尝试使用ArrayList<>使用Object引用变量的任何属性/方法o,例如o.size();编译器会抛出错误。

于 2013-04-27T22:39:56.187 回答
0

Java 7 之前的空菱形是所谓的原始泛型,实际上这意味着容器不会对所包含的项目强制执行任何类型约束,除了它们应该是一个对象。所以基本上new ArrayList<>();还是new ArrayList();意思new ArrayList<Object>();。这基本上会抛弃 Java 泛型提供的任何类型安全性。

@scottb 提醒我们:Java 7 为空菱形提供了更好的用法:通过编译器执行类型推断,您的代码可以更简洁,更不容易出错。而不是HashMap<String, Integer> m = new HashMap<String, Integer>();你可以说HashMap<String, Integer> m = new HashMap<>();

对于第一部分:如果您使用变量引用它,java.lang.Object您感知对象的类型是什么。操作员不关心 的类型是什么,它会准确地回答您的问题:“存储在”变量后面的东西是否真的是一个或不是。ArrayListoinstanceofooArrayList

于 2013-04-27T22:31:50.653 回答