char c='c';
int i=10;
double d =50;
long l=30;
String s="Goodbye";
这些声明是否有效?
s+=i;
i+=s;
c+=s;
c=c+i;
有人可以解释转换数据类型的逻辑
答案 0 :(得分:3)
你为什么不尝试一下:
bash-3.2$ cat ConveraionTest.java
public class ConvertsonTest {
public static void main( String [] args ) {
char c='c';
int i=10;
double d =50;
long l=30;
String s="Goodbye";
//Are these statement valid?
s+=i;
i+=s;
c+=s;
c=c+i;
}
}
bash-3.2$ javac ConversionTest.java
ConversionTest.java:12: incompatible types
found : int
required: java.lang.String
i+=s;
^
ConversionTest.java:13: incompatible types
found : char
required: java.lang.String
c+=s;
^
ConversionTest.java:14: possible loss of precision
found : int
required: char
c=c+i;
^
3 errors
修改强>
历史悠久
基本上,java中的所有类型都有一个“形状”,如果你想这样调用它(好吧我会这样称呼它)
对于基元数据类型(boolean,byte,short,char,int,float,long,double),“shape”是它使用的字节大小(或以位为单位,此处为1) byte = 8位):
boolean = true or false byte = 8 bits short = 16 bits char = 16 bits int = 32 bits float = 32 bits long = 64 bits double = 64 bits
对象的“形状”因其类别而异。
所以,基本上你可以为任何东西分配任何东西,只要它们适合“形状”
因此,您可以将int
分配给long
(您可以将32位适合64位),短(16)分配到int(32)等。
你不能做的是分配一些不适合形状的东西。
所以
ConversionTest.java:12: incompatible types
found : int
required: java.lang.String
i+=s;
^
您无法将String
分配到int
。你好吗?内容在哪里?它们不是“形状”,也不是兼容的。“
String
与char
ConversionTest.java:13: incompatible types
found : char
required: java.lang.String
c+=s;
^
现在,您可以将一个int(32位)分配给char(16位)或短(16位)。问题是,如果该值保持>超过16位(例如131 071)
您将丢失不适合16位的位。这就是你得到这个错误的原因:
ConversionTest.java:14: possible loss of precision
found : int
required: char
c=c+i;
但是,如果您确定它适合(例如int i = 65;
当然适合16位),您可以强制它,如下所示:
int i = 65;
char c = ( char ) i;
按照你告诉编译器的方式进行转换:
嘿,我是这里的程序员,我知道我在做什么。
答案 1 :(得分:2)
是,否,否,否(除非您明确执行类型转换)。如果您要编写一个简单的main
方法,编译它并执行它,您可能已经看到了 - 这些问题应该由编译器识别。
答案 2 :(得分:1)
char c='c';
int i=10;
double d =50;
long l=30;
String s="Goodbye";
s+=i; // legal :)
i+=s; // not legal :( The operator += is undefined for the argument types int, String
c+=s; // not legal :( The operator += is undefined for the argument types char, String
c=c+i; // not legal :( Type Mismatch: cannot convert from int to char
答案 3 :(得分:1)
转化有两种类型:扩大转化次数和缩小转化次数。允许扩展转换,Java将为您处理,但不允许缩小转换。扩展转换意味着您将“较小”值(如int(32位))转换为“较大”值(如long(62位))。缩小转换的方式必须明确地进行。
s+=i;
将要求将int转换为允许的String。
i+=s;
将要求将String转换为不允许的int。 + =运算符将转换为
i = i + s;
和i + s将返回一个无法分配给int的字符串。
c+=s;
由于c + s返回您尝试分配给char的String,因此不允许这样做。
c=c+i;
也会产生错误,因为c + i将导致int(32位)并将其分配给char(16位)可能会导致精度损失。
您尝试的每个操作实际上都是可能的,但您必须明确告诉Java您要执行它们并接受后果。已经说过,混合型操作在完全纯粹的硬鼻编程领域中是不受欢迎的,因为存在可能导致问题的边缘情况。
答案 4 :(得分:0)
s + =我将连接s和字符串“10”,这等于s + =((整数)i).toString();
i + = s不认为这会起作用,类型不兼容
c + = s也不应该编译,相同,不兼容的类型。
c = c + i应该在c的ascii值中加10,c将变为'c'=>之后的第10个字母我想,我猜
EDIT。所以在最后一种情况下,你必须将i转换为char以使其编译。