在第一种情况下,您只是打印adjMatrix[3].get(0)
.编译器认为此表达式是Integer.但实际类型并不重要:生成的字节码是
37: invokevirtual #8 // Method java/util/LinkedList.get:(I)Ljava/lang/Object; 40: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
所以它只是将它从列表中获取的对象传递给它PrintStream.println(Object)
,然后调用String.value()
该对象.编译器从不向字节码添加强制转换,因为它不是必需的.
在第二种情况下,您打印stringList[1].get(0)+""
,编译器认为它是String与空String的串联.所以生成的字节码是
101: invokevirtual #8 // Method java/util/LinkedList.get:(I)Ljava/lang/Object; 104: checkcast #14 // class java/lang/String 107: invokevirtual #15 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 110: ldc #16 // String 112: invokevirtual #15 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 115: invokevirtual #17 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 118: invokevirtual #18 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
如您所见,这里有一个checkcast指令,因为字节码需要调用StringBuilder.append(String)
,因此需要将表达式强制转换为String.因为它实际上是一个Integer,所以它会引发ClassCastException.
在第一种情况下,您只是打印adjMatrix[3].get(0)
.编译器认为此表达式是Integer.但实际类型并不重要:生成的字节码是
37: invokevirtual #8 // Method java/util/LinkedList.get:(I)Ljava/lang/Object; 40: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
所以它只是将它从列表中获取的对象传递给它PrintStream.println(Object)
,然后调用String.value()
该对象.编译器从不向字节码添加强制转换,因为它不是必需的.
在第二种情况下,您打印stringList[1].get(0)+""
,编译器认为它是String与空String的串联.所以生成的字节码是
101: invokevirtual #8 // Method java/util/LinkedList.get:(I)Ljava/lang/Object; 104: checkcast #14 // class java/lang/String 107: invokevirtual #15 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 110: ldc #16 // String 112: invokevirtual #15 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 115: invokevirtual #17 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 118: invokevirtual #18 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
如您所见,这里有一个checkcast指令,因为字节码需要调用StringBuilder.append(String)
,因此需要将表达式强制转换为String.因为它实际上是一个Integer,所以它会引发ClassCastException.