void test() {
String s1 = "1";
//int i1 = int(s1); -- compilation error
int i1 = Integer.parseInt(s1);
long l1 = 1;
int i2 = (int) l1;
}
何时使用Integer.parseInt
转换为Integer
以及何时仅使用int
转换为Integer
?
答案 0 :(得分:4)
从孩子到父母的投射(向下投射)或反之亦然(向上投射):
class A extends B
B b = (B)(new A());
或在接口的情况下:
List<String> myList = new ArrayList<>();
ArrayList<String> myArrayList = (ArrayList)myList;
或原语之间 - 你的情况。
您可以决定将long
转换为int
,反之亦然。
解析在某种程度上是不同的。你接受一个与数字类型无关的String
,并声明你希望try
将它解析成一个数字。
您坚信String
只有数字(在任何一个数字系统中,直到16),并且您希望将该数字用作数字变量。
specification chapter 5广泛描述了这种机制。根据基元进行转换可以代表两种操作之一:扩展基本转换或缩小基本转换。
有19种可能的扩展原始转换。拓宽意味着从较小的类型变为更大的类型。
+-----------+-------+------+-------+-------+--------+
| | short | int | long | float | double |
| short -> | | x | x | x | x |
| int -> | | | x | x | x |
| long -> | | | | x | x |
| float -> | | | | | x |
| double -> | | | | | |
+-----------+-------+------+-------+-------+--------+
您可以了解后果here。
+-----------+------+------+-------+------+-------+-------+--------+
| | byte | char | short | int | long | float | double |
| byte -> | | | | | | | |
| char -> | | | | | | | |
| short -> | x | x | | | | | |
| int -> | x | x | x | | | | |
| long -> | x | x | x | x | | | |
| float -> | x | x | x | x | x | | |
| double -> | x | x | x | x | x | x | |
+-----------+------+------+-------+------+-------+-------+--------+
后果描述为here。
描述了转化转化here。它们包括所有可能的强制转换,包括字符串转换,当使用+
操作数用于String和非字符串时使用。
答案 1 :(得分:0)
int
是原始类型。因此,它没有任何构造函数,更不用说来自java.lang.String
的构造函数。所以int i1 = int(s1);
毫无意义。
幸运的是,盒装模拟Integer
包含一个静态方法parseInt
,它产生int
并取java.lang.String
。正是你想要的!
答案 2 :(得分:0)
Integer.parseInt
是解析String
并创建预期类型的值,在这种情况下它实际上不会投射。
转换是将一个类的实例转换为另一个类(或原始类型转换为另一个类)