繁体   English   中英

在Java中,我可以使用条件表达式“选择”引用类型吗?

[英]In Java, can I use the conditional expression to “choose” reference types?

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

??? = isTrue() ? Integer : Double;

有什么东西可以放在“ ??? ”中以使代码片段可编辑吗?

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

您可以选择实施,但您将无法使用任何实现的特殊性; 在你的例子中,你可以做到

Number n = isTrue() ? 1 : 1.0;

这将被自动装箱到下面的正确数据类型,但由于超类是数字,你真的不能用它做太多。

编辑:

由于上面的实际示例是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

不,因为这不是语法上有效的Java。 如果用Integer.class和Double by Double.class替换Integer,它就可以正常工作。 但是,我希望这不是你想要的。

在这种情况下, ??? 必须是

Class var

我想您正在尝试使用三元布尔运算符来选择变量的引用类型。

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

你可以做类似的事情,但你必须将Integer和Double作为字符串传递给另一个参数,也许是一个构造函数,它将实例化你正在寻找的类型变量。 正如你所看到的,这个解决方案需要很多创造力,所以我想你的问题的答案越短越正确。

编辑 :我的原始答案是错误的,正如Jesper所指出的......并且感谢Jesper我还有另一个理由来阻止人们使用三元运算符,因为以下if / else行为举例说明了我最初追求的行为:

 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();

当然,你将在这里失去确切的子类型,但它至少会编译你想要的。

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

你可以得到的最接近的是将它们存储在最接近的可用超类型中(在这种情况下是数字):

Number n = functionReturningBoolean() ? 1.0 : 1;

...然后如果你真的想要访问特定于单一类型的东西,请检查并投射。 这是令人讨厌的,我想不出我在实践中使用它的情况(虽然这不是挖掘,纯粹的学术问题和实际问题一样有效!)

如果您只是想选择一个类型而不是实例,那么您可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM