理论:列表声明Object list = new ArrayList();

时间:2012-06-05 03:35:51

标签: java

我正在考试,我正在考试......我正在考虑一种优雅的方式来回答以下问题,我目前的答案是类似的(基于此answer的信息计算器)

  

上面的初始化是不可能的,它会编译但在声明中缺少一个标识符,而其他函数如add,remove将不可用。

问题..

  

请考虑以下代码段。是否可以将ArrayList的实例分配给声明为Object的变量,如第1行所做的那样?解释

  Object strings = new ArrayList();

  strings.toString();

有什么其他方法可以解答这个问题?你能否提供维基百科/资源,所以我可以进一步研究编译器如何将其转换为字节码?谢谢

2 个答案:

答案 0 :(得分:2)

  

请考虑以下代码段。是否可以将ArrayList的实例分配给声明为Object的变量,如第1行所做的那样?解释

   Object strings = new ArrayList();

   strings.toString();

是的,这是可能的。 ObjectArrayList的超类型(实际上,Object是所有Java引用类型的超类型)。将变量声明为指定的实际类型的超类型是合法的。

使用List的具体实现定义ArrayList时会出现类似情况:

  List<String> list = new ArrayList<String>();

答案 1 :(得分:1)

它确实编译(你试过吗?)但是生成的ArrayList很难使用,因为它被声明为Object。例如,行:

strings.add("hello");

将无法编译,因为对于Object类型,未定义add()。然而,

((List)strings).add("hello");

编译。