在Java中,我可以使用条件表达式来;选择「;参考类型?

在Java中,我可以使用条件表达式来;选择「;参考类型?,java,conditional-operator,Java,Conditional Operator,我是否可以使用条件表达式“选择”引用类型,如下所示 ??? = isTrue() ? Integer : Double; 有什么东西可以放在“?”中使代码段可编译吗 编辑:当我编写Integer和Double时,我不是指Integer或Double的实例。我指的是引用类型Integer和Double。您可以选择实现,但不能使用实现的任何特殊性;在您的示例中,您可以 Number n = isTrue() ? 1 : 1.0; 这将自动装箱到下面正确的数据类型,但由于超类是Number,因此您

我是否可以使用条件表达式“选择”引用类型,如下所示

??? = isTrue() ? Integer : Double;
有什么东西可以放在“
”中使代码段可编译吗


编辑:当我编写Integer和Double时,我不是指Integer或Double的实例。我指的是引用类型Integer和Double。

您可以选择实现,但不能使用实现的任何特殊性;在您的示例中,您可以

Number n = isTrue() ? 1 : 1.0;
这将自动装箱到下面正确的数据类型,但由于超类是Number,因此您实际上无法使用它做很多事情

编辑:

由于上面的实际示例是Java中的一个已知错误,下面是另一个行为与预期一致的错误:

CharSequence cs = isTrue() ? "I'm a String"
                           : new StringBuilder().append("I'm a StringBuilder");

System.out.println(cs+" "+cs.getClass());
// prints out
// I'm a String class java.lang.String

您可以这样做,但必须将Integer和Double作为字符串传递给另一个参数,可能是一个构造函数,它将实例化您正在寻找的类型变量。正如您所看到的,这个解决方案需要大量的创造力,因此我想对您的问题的简短而正确的回答并不是真的。

不,因为这在语法上不是有效的Java。如果用Integer.class替换Integer,用Double.class替换Double,它就可以正常工作。然而,我想那不是你想要的


那样的话???必须是var类编辑:正如Jesper所指出的,我最初的答案是错误的。。。感谢Jesper,我还有另一个理由劝阻人们不要使用三元运算符,因为下面的if/else行为就是我最初追求的行为的例子:

Class var
 Number n;
    if (isTrue()) { n = Double.valueOf(1.0); }
    else {n = Integer.valueOf(1);}
    System.out.println(n.getClass().getName()) //prints java.lang.Integer if isTrue returns false

原始答案:

您需要指定一个Double或Integer的超类型才能使其工作。数字应该起作用

Number n = isTrue() ? whateverYouDoToReturnInteger() :  whateverYouDoToReturnDouble();

诚然,您将在此处丢失确切的子类型,但它至少会编译您想要的类型。

您可以使用不同的类型,但必须将结果存储在两者的超类型中。所以快速的答案是否定的,你不能这样选择引用类型

最接近的方法是将它们存储在最接近的可用超类型中(在本例中为数字):


…然后,如果您确实希望访问特定于单个类型的内容,请选中并强制转换。虽然这很糟糕,但我想不出在实践中使用它的情况(虽然这不是一个挖掘,纯粹的学术问题和实际问题一样有效!)

我认为您试图使用三元布尔运算符来选择变量的引用类型


这在Java中是不可能的,因为Java是静态类型的,这意味着每种类型都在编译时定义良好。您的表达式希望运行一个方法,并根据其输出确定编译时不可能的引用类型。

如果您只是尝试获取一个类型,而不是一个实例,则可以执行以下操作:


类结果=isTrue()?Integer.class | Double.class

我什么都不想做。我只是想知道是否可能。我想知道是谁把这个完全错误的答案投了赞成票。当然,它在语法上不是有效的java,但问题显然不是这样的。理解我问题的人。我怀疑这是不可能的,但我想得到安慰。谢谢。@John Assymptoth,那么我就改错了。对不起,我甚至没有想到这可能是个问题。你试过这个吗?这不管用。您的代码将始终返回一个
Double
,无论
isTrue()
返回什么。这是一个已知的Java陷阱。@Jesper:我在这里解释的是一般的想法(如何在条件中使用公共超类/接口作为基类型,以允许将不同的子类作为实际类型),而不是特定的用例——无可否认,这确实是不正确的。JDK本身并没有包含很多其他有用的例子……我将在另一个没有bug的例子中进行编辑。这不起作用,
n
将始终是一个
Double
,无论布尔表达式的结果如何。试试看@杰斯珀,你的评论到处都是。感谢您指出这一点。您可以声明
Number n = functionReturningBoolean() ? 1.0 : 1;