2012-06-05 60 views
-2

我有一个考试即将到来,我正在学习......并且我正在考虑一个优雅的方式来回答以下问题,我当前的答案会是类似的(基于此信息,来自于此计算器上的answer理论:列表声明Object list = new ArrayList();

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

的问题..

考虑下面的代码片段。是否可以将一个ArrayList的实例分配给一个声明为Object的变量,如第1行所示?说明。

Object strings = new ArrayList(); 

    strings.toString(); 

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

+2

而不是张贴代码的图像,只需发布​​代码。 – Jeffrey

+1

顺便说一句,它编译:http://ideone.com/3NAbz – Naveen

+1

这似乎是一个非常简单的问题(特别是在考试时),看看代码编译之前明确表示它没有。 –

回答

2

请考虑下面的代码片段。是否可以将一个ArrayList的实例分配给一个声明为Object的变量,如第1行所示?说明。

Object strings = new ArrayList(); 

    strings.toString(); 

是的,它是可能的。 Object是一个超类型的ArrayList(实际上,Object是所有Java引用类型的超类型)。声明一个变量为所分配的实际类型的超类型是合法的。

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

谢谢! :-)我打算对超类型做更多的研究。 :P – Killrawr

+0

我会稍微修改答案:*“实际上,Object是所有Java **引用类型的超类型**”*。挑剔的考官可能会说,数组不是类,它可能会或可能不会是真实的,这取决于您使用的术语。使用官方的Java术语“引用类型”可以消除任何可能的谬误。 –

1

它编译(?你尝试的话),但所产生的ArrayList是很难使用,因为它被声明为:

当你定义一个List与具体落实ArrayList发生类似的情况成为一个对象。例如,行:

strings.add("hello"); 

不会编译,因为add()未定义类型对象。但是,

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

确实编译。

+0

谢谢,是的,我已经测试它可以在日食上编译,但我有一些来自[这里]的研究(http://stackoverflow.com/questions/2516778/java-how-to-have-an-arraylist-as-instance - 对象的变量)并基于这个问题..我认为它会编译,谢谢澄清。 – Killrawr

+1

@Killrawr:链接帖子使用泛型(位于< >内部的位),但没有声明变量名称。看看我答案中的最后一个代码块,查看正确的泛型示例。 (你原来的问题没有在示例代码中使用泛型)。 –

+0

@GregKopff哦好点。我想过定义字符串或数据类型列表而不是对象列表。会很好,因为从列表中检索的对象不必被转换。 – Killrawr

相关问题