让我们看看以下代码段中的简单Java代码:
public class Main {
private int temp() {
return true ? null : 0;
// No compiler error - the compiler allows a return value of null
// in a method signature that returns an int.
}
private int same() {
if (true) {
return null;
// The same is not possible with if,
// and causes a compile-time error - incompatible types.
} else {
return 0;
}
}
public static void main(String[] args) {
Main m = …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用了这段代码(简化版):
Object result;
if (check)
result = new Integer(1);
else
result = new Double(1.0);
System.out.println(result);
return result;
Run Code Online (Sandbox Code Playgroud)
然后我决定将if-else语句重构为三元条件表达式,因此我的代码更简洁:
Object result = check ? new Integer(1) : new Double(1.0);
System.out.println(result);
return result;
Run Code Online (Sandbox Code Playgroud)
原来,如果检查是true两个版本打印不同的结果:
1
Run Code Online (Sandbox Code Playgroud)
要么:
1.0
Run Code Online (Sandbox Code Playgroud)
三元条件不等于相应的if-else吗?
Object myObject = true ? new Integer(25) : new Double(25.0);
System.out.println(myObject);
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它输出25.0而不是25
这是怎么回事?
请考虑我们的代码如下:
Object obj = true ? new Integer(0) : new Long(1);
System.out.println(obj.getClass() + "\nvalue = " + obj);
Run Code Online (Sandbox Code Playgroud)
其结果是:
class java.lang.Long
value = 0
Run Code Online (Sandbox Code Playgroud)
代替:
class java.lang.Integer
value = 0
Run Code Online (Sandbox Code Playgroud)
有人可以澄清为什么我们在Java中有这样的功能吗?这对我来说很奇怪.你有什么例子可以用吗?
更新:这是一段字节码,我们可以看到,那里有什么
NEW java/lang/Integer
DUP
LDC "0"
INVOKESPECIAL java/lang/Integer.<init> (Ljava/lang/String;)V
INVOKEVIRTUAL java/lang/Integer.intValue ()I
I2L
INVOKESTATIC java/lang/Long.valueOf (J)Ljava/lang/Long;
ASTORE 1
Run Code Online (Sandbox Code Playgroud) 我正在玩三元运算符并注意到一些奇怪的东西.我的代码如下:
class Main {
static void foo(int a){
System.out.println("int");
}
static void foo(String a){
System.out.println("String");
}
static void foo(Object a){
System.out.println("object");
}
public static void main(String[] args) {
foo(2==3 ? 0xF00:"bar");
System.out.println((2==3 ? 0xF00:"bar").getClass().getName());
}
}
Run Code Online (Sandbox Code Playgroud)
结果如何
宾语
java.lang.String中
第一行结果显示该指令使用object参数传递给foo方法.
指令本身导致String的第二行.
题:
为什么结果是String编译器决定使用Object?
这是因为类型模糊吗?
如果是,那么为什么获取类名返回java.lang.String?
在java中发现了一些奇怪的东西.
码:
System.out.println(System.getProperty("java.version"));
System.out.println((true) ? (int)2.5 : 3.5);
System.out.println((true) ? (int)2.5 : 3);
System.out.println((true) ? (int)2.5 + "" : 3.5);
Run Code Online (Sandbox Code Playgroud)
结果:
1.8.0_40 2.0 2 2
它是什么?为什么只有当false的值不是double或者如果将字符串值添加到true的值时,整数值才会返回?为什么第二行舍入按(int)强制转换,但双值返回呢?这是一个错误吗?
我有一些java重载和动态参数的问题..
import java.lang.*;
public class Program
{
public static void main(String []args){
testOverloading("Test string");
testOverloading(new Object());
testOverloading( true ? "Must be a string" : new Object());
}
public static void testOverloading(String test) {
System.out.println("it's a string");
}
public static void testOverloading(Object test) {
System.out.println("it's an object");
}
}
Run Code Online (Sandbox Code Playgroud)
运行此代码,java假设"true?"必须是一个字符串":new Object()"是一个对象而不是一个字符串..输出如下:
it's a string
it's an object
it's an object
Run Code Online (Sandbox Code Playgroud)
对于这类问题有解决方案/解释吗?
更新:
我也尝试过使用不同的方法:
变化:
testOverloading( true ? "Must be a string" : new Object());
Run Code Online (Sandbox Code Playgroud)
在
testOverloading( true ? "Must be a …Run Code Online (Sandbox Code Playgroud) java ×7
autoboxing ×1
casting ×1
double ×1
dynamic ×1
operators ×1
overloading ×1
parameters ×1
types ×1