相关疑难解决方法(0)

将null返回为允许使用三元运算符的int,而不是if语句

让我们看看以下代码段中的简单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)

java autoboxing nullpointerexception conditional-operator

185
推荐指数
5
解决办法
2万
查看次数

Java中使用盒装类型的三元条件的奇怪行为

我在我的应用程序中使用了这段代码(简化版):

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吗?

java ternary-operator

23
推荐指数
2
解决办法
626
查看次数

为什么条件运算符的结果与预期相反?

Object myObject = true ? new Integer(25) : new Double(25.0);

System.out.println(myObject);
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它输出25.0而不是25

这是怎么回事?

java operators

12
推荐指数
1
解决办法
220
查看次数

代码对象o = true?new Integer(0):new Long(1)返回值为0的Long.为什么?

请考虑我们的代码如下:

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)

java

10
推荐指数
1
解决办法
757
查看次数

具有不同类型表达式的三元运算符

我正在玩三元运算符并注意到一些奇怪的东西.我的代码如下:

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的第二行.

题:

  1. 为什么结果是String编译器决定使用Object?

  2. 这是因为类型模糊吗?

  3. 如果是,那么为什么获取类名返回java.lang.String

java ternary-operator

8
推荐指数
1
解决办法
242
查看次数

java中的奇怪事情

在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 double types casting

5
推荐指数
1
解决办法
350
查看次数

Java重载的奇怪行为

我有一些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 parameters overloading dynamic

2
推荐指数
1
解决办法
95
查看次数