有人能告诉我这里发生了什么吗?它看起来像myObj被强制转换为String []所以它可以在for循环中迭代。但它被构造为新的String [] - 为什么需要强制转换?
public static void main(String args[]) {
Object myObj = new String[]{"one", "two", "three"};
for (String s : (String[])myObj) {
System.out.print(s + ".");
}
}
谢谢!
答案 0 :(得分:5)
它被创建为String[]
并不重要;你只有一个Object
引用。这与for-each无关;以下内容不会编译:
Object myObj = new String[]{"one", "two", "three"};
System.out.println(myObj.length); // There is no Object.length
答案 1 :(得分:2)
当您将myObj
声明为Object
时,您告诉它忘记它是其他任何内容。
答案 2 :(得分:0)
为什么不将数组声明为实际类型?像这样:
Syting[] myObj = new String[]{"one", "two", "three"};
这样,演员阵容不是必需的
答案 3 :(得分:0)
表观类型和实际类型之间存在差异。 Object myObj []语句告诉Java您正在声明一个Object数组。在编译时,这是Java唯一感兴趣的类型。稍后当您尝试访问数组的元素时,Java会假定为Object而不是其他内容。 String被称为实际类型,并且仅在运行时“已知”。因此铸造的原因。
答案 4 :(得分:0)
在编译时检查您尝试迭代的对象的类型。在编译时,唯一可用的信息是变量的声明类型。编译器不能[可靠,总是]弄清楚你实际上在那里放了一个String [](google“停止问题”来了解原因)。
运行时类型信息用于多态,类型转换,可能是我目前无法想到的其他事情。