为什么
char ch = '4';
ch = '4' + 2;
Run Code Online (Sandbox Code Playgroud)
工作,但是
char ch = '4';
ch = ch + 2;
Run Code Online (Sandbox Code Playgroud)
不?
我见过一些这样的符号,但我找不到任何奇怪的东西,
double d = 5D;
float f = 3.0F;
Run Code Online (Sandbox Code Playgroud)
5后面的D和F究竟意味着什么?
在Java中,允许以下内容:
char c = 'A' + 1;
Run Code Online (Sandbox Code Playgroud)
这里,c将保持值'B'.在上面,首先评估表达式.所以'A'被转换为65,整个表达式的计算结果为66,然后66被转换为'B',因为我们将值存储在char中.
但是,以下内容会产生编译时错误:
char c = 'A';
c = c + 1;
Run Code Online (Sandbox Code Playgroud)
Java如何以不同方式查看表达式的解释是什么?顺便说一句,以下工作也很好:
char c = 'A';
c++;
Run Code Online (Sandbox Code Playgroud) public class Java{
public static void main(String[] args){
final byte x = 1;
final byte y = 2;
byte z = x + y;//ok
System.out.println(z);
byte a = 1;
byte b = 2;
byte c = a + b; //Compiler error
System.out.println(c);
}
}
Run Code Online (Sandbox Code Playgroud)
如果涉及任何int-sized或者更小的表达式的结果总是为int,即使两个字节的总和适合一个字节.
当我们添加两个适合字节的最终字节时,为什么会这样? 没有编译器错误.
以下代码段发出编译时错误.
char c = 'c';
char d = c + 5;
Run Code Online (Sandbox Code Playgroud)
第二行的错误说,
possible loss of precision
required: char
found: int
Run Code Online (Sandbox Code Playgroud)
该错误消息基于NetBeans IDE.
当此字符c声明final如下时.
final char c = 'c';
char d = c + 5;
Run Code Online (Sandbox Code Playgroud)
编译器时间错误消失了.
它与最终字符串的情况无关
什么是final修改有所作为吗?
我使用的是一种名为DDS的技术,在IDL中,它不支持int.所以,我想我会用short.我不需要那么多位.但是,当我这样做时:
short bit = 0;
System.out.println(bit);
bit = bit | 0x00000001;
System.out.println(bit);
bit = bit & ~0x00000001;
bit = bit | 0x00000002;
System.out.println(bit);
Run Code Online (Sandbox Code Playgroud)
它说"类型不匹配:无法从int转换为short".当我换short到时long,它工作正常.
是否有可能short在Java中执行这样的按位运算?
我为使这段代码工作而必须做的事感到困惑.似乎编译器优化了我需要的类型转换,或者在这里我还有其他一些我不理解的东西.
我有各种对象存储在实现接口的数据库中Foo.我有一个对象,bar它保存我用来检索我的Foo对象的数据.bar有这些方法:
Class getFooClass()
Long getFooId()
Run Code Online (Sandbox Code Playgroud)
我将类和ID传递给具有此签名的方法,该方法委托给hibernate,后者根据其类和ID检索主题:
public <T> T get(Class<T> clazz, Serializable id);
Run Code Online (Sandbox Code Playgroud)
有不同的实现者Foo,其中一些hibernate对象有Longid,而其他有Integerid.虽然这种方法接受了,但更远的地方最好接受正确的方法.因此,当我尝试调用get()带有Integerid 的对象时,如下所示,我可以理解地抱怨我提供了Long一个Integer需要的位置:
get(bar.getFooClass(), bar.getFooId());
Run Code Online (Sandbox Code Playgroud)
这里有没有休眠的问题,我只需要提供一个Integer地方的Integer需要ID和Long其中一个Long是必需的ID.所以我添加了一个方法bar,hasLongId()和试过这:(在这一点上,你可能会想,这不是一个很好的设计,但现在这不是我的问题)
get(bar.getFooClass(),
bar.hasLongId() ? bar.getFooId() : bar.getFooId().intValue());
Run Code Online (Sandbox Code Playgroud)
它仍然抱怨我提供了一个Long.这看起来很奇怪.然后我尝试了这个:
get(bar.getFooClass(),
bar.hasLongId() ? bar.getFooId()
: new Integer(bar.getFooId().intValue()));
Run Code Online (Sandbox Code Playgroud)
同样的错误!怎么会这样?所以我介入调试器,是的,它逐步完成intValue()并通过Integer构造函数,但是在get方法中,传递的参数实际上是一个Long- Long从返回的同一个对象getFooId(). …
我有这样的代码
short a = 1;
short b = 2 ;
short c = a + b; // dosen't compile
Run Code Online (Sandbox Code Playgroud)
编译失败的原因是什么?x+ x总是产生Integer或更大 Number,但为什么?
byte a=10;
byte b=20;
b=a+b;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我需要a+b像这样显式转换为字节:
b=(byte)(a+b);
Run Code Online (Sandbox Code Playgroud)
与short相同:
short x=23;
short y=24;
Run Code Online (Sandbox Code Playgroud)
否则会产生错误。
但是在整数的情况下,不需要显式转换:
int p=7788;
int q=7668;
p=p+q;
Run Code Online (Sandbox Code Playgroud)
这样就可以了。
这是为什么?
即使在很长的情况下,我们也不需要显式转换。
当我试图做这样的事情时,我收到了一个错误:
byte a = 23;
a = a - 1;
Run Code Online (Sandbox Code Playgroud)
编译器给出了这个错误:Test.java:8:可能发现精度损失:int required:byte a = a - 1; ^ 1错误
转换不能解决错误...为什么编译器不让我这样做?我是否需要将变量'a'转换为int?
我有三个短变量.当我将两个加在一起并将结果分配给第三个时,eclipse告诉我,我需要将其转换为简短的!
short sFirst, sSecond, sThird;
sFirst = 10;
sSecond = 20;
sThird = sFirst + sSecond;
Run Code Online (Sandbox Code Playgroud)
Hovever,当我做一个简单的任务,然后是增量赋值时,一切都很好.
short sFirst, sSecond, sThird;
sFirst = 10;
sSecond = 20;
sThird = sFirst;
sThird += sSecond;
Run Code Online (Sandbox Code Playgroud)
为什么是这样 ?