for-each语法转换

时间:2011-11-13 20:36:29

标签: java

有人能告诉我这里发生了什么吗?它看起来像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 + ".");
  }
}

谢谢!

5 个答案:

答案 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“停止问题”来了解原因)。
运行时类型信息用于多态,类型转换,可能是我目前无法想到的其他事情。