Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于每个语法强制转换_Java - Fatal编程技术网

Java 对于每个语法强制转换

Java 对于每个语法强制转换,java,Java,有人能告诉我这是怎么回事吗?在我看来,myObj被转换为String[],因此可以在for循环中对其进行迭代。但它被构造为新字符串[]——为什么需要对其进行强制转换 public static void main(String args[]) { Object myObj = new String[]{"one", "two", "three"}; for (String s : (String[])myObj) { System.out.print(s + ".");

有人能告诉我这是怎么回事吗?在我看来,myObj被转换为String[],因此可以在for循环中对其进行迭代。但它被构造为新字符串[]——为什么需要对其进行强制转换

public static void main(String args[]) {
  Object myObj = new String[]{"one", "two", "three"};
  for (String s : (String[])myObj) {
      System.out.print(s + ".");
  }
}

谢谢

它被创建为
字符串[]并不重要。
;您只有一个
对象
对它的引用。这与每个人无关;以下内容也无法编译:

Object myObj = new String[]{"one", "two", "three"};
System.out.println(myObj.length);  // There is no Object.length

为什么不将数组声明为实际类型?像这样:

Syting[] myObj = new String[]{"one", "two", "three"};

这样,强制转换就没有必要了。

当您将
myObj
声明为
Object
时,您告诉它忘记它是其他类型。

外观类型和实际类型之间存在差异。objectmyobj[]语句告诉Java您正在声明一个对象数组。在编译时,这是Java感兴趣的唯一类型。稍后,当您尝试访问数组元素时,Java假定为对象,而不是其他对象。该字符串称为实际类型,在运行时仅为“已知”。因此进行强制转换的原因。

在编译时检查您试图迭代的对象的类型。在编译时,唯一可用的信息是声明的变量类型。编译器无法[可靠地,总是]找出您实际上在那里放了一个字符串[](谷歌“暂停问题”来了解原因)。

运行时类型信息用于多态性、类型转换,可能还有其他我目前无法想到的事情。

因为它被声明为
对象