2012-02-16 143 views
7

为C++老爷车我已成功地解决我的问题,但我不能在这里换我的头周围的底层Java机制:Java列表VS ArrayList的

Vector<Object> x = new Vector<Object>();  // OK 
ArrayList<Object> y = new ArrayList<Object>(); // OK 
List<Object> zzz = new ArrayList<Object>();  // OK solves problem below but question remains 
List<Object> z = new List<Object>();   // WHY? Compiler error: Cannot instantiate 

回答

14

List是一个接口,有点像一些一类用C++编写的= 0方法。你不能实例化它。

但是ArrayList<T>“继承”List<T>(或以Java术语来说,实现它),所以这些引用是分配兼容的。

+0

感谢大家。 – Adam 2012-02-16 10:03:45

+0

你们真的很快 – Adam 2012-02-16 10:04:00

+0

@Adam - 等到你使用Java泛型中的通配符! :)答案需要一点时间才能显示。 – 2012-02-16 10:27:43

5

列表是一个接口,你不能初始化它。 ArrayList implements List,因此您可以将ArrayList实例分配给List变量。

1

列表不是类,它是一个接口,你不能实例化接口对象。

ArrayList的是这是实现List接口,这样可以能够实例化ArrayList对象和分配给列表对象

1

List是一个接口的类。使用new运算符不能创建接口实例。这就是为什么行List<Object> z = new List<Object>();给出错误。只有类可以被实例化。

0

List是一个interface并且一个接口不能实例化。

它用于实现多态性。即接口类型的引用可以保存implements它的任何类别的对象。

List<Object> zzz = new ArrayList<Object>(); 

它的工作原因是ArrayList实现List。

1

“接口”就像一个对象必须遵守的协议。

+0

使用协议作为类比的有趣方法。虽然多一点文字“它”是什么,什么不可能更清楚一点。 – 2012-02-16 14:53:46

+1

我从来没有听说过这方面的协议。但我明白你的意思。我更喜欢合同这个词:http://en.wikipedia.org/wiki/Design_by_contract – Adam 2012-02-16 15:13:29

+0

@亚当我同意,合同是一个更好的词。 – Benjamin 2012-02-16 22:28:36

2

是的。 因为List是一个接口,所以在Java中你不能实例化一个接口。 你只能实例化一个类。

ArrayList是一个类实现列表<>这就是为什么你可以实例化它。 :)