繁体   English   中英

如何将字符串转换为整数?

[英]How can a string be casted to an Integer?

    LinkedList<Integer> adjMatrix[] = new LinkedList[10];
    Object[] temp = (Object[]) adjMatrix;
    LinkedList<String> string = new LinkedList<String>();
    string.add("abc");
    temp[3] = string;
    System.out.println(adjMatrix[3].get(0));
    //prints abc

    //====================================================

    LinkedList<String>[] stringList = new LinkedList[10];
    Object[] oa = (Object[]) stringList;
    LinkedList<Integer> listInt = new LinkedList<Integer>();
    listInt.add(new Integer(3));
    oa[1] = listInt;
    System.out.println(stringList[1].get(0));
    // gives ClassCastException java.lang.Integer cannot be cast to java.lang.String

我有点困惑在第一种情况下到底发生了什么,一个整数接受了一个字符串值,但是在第二种情况下却没有发生。 有什么想法吗?

在第一种情况下,您只是打印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。 由于它实际上是一个整数,因此将引发ClassCastException。

第一个示例创建损坏的数组。 这就是为什么在尝试使用泛型数组时会收到警告的原因,因为JVM无法强制类型安全。

请记住,由于类型擦除, LinkedList<Integer> adjMatrix[]实际上在运行时是LinkedList adjMatrix[] ,即它可以存储所有对象类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM