我可以使用条件表达式“选择”引用类型,如下所示吗?
??? = isTrue() ? Integer : Double;
我可以在“???
”中放置一些内容以使代码段可编辑吗?
编辑:当我编写Integer和Double时,我并不是指Integer或Double的实例。我的意思是引用类型Integer和Double。
答案 0 :(得分:4)
您可以选择实施,但您将无法使用任何实施的特殊性;在你的例子中,你可以做
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
答案 1 :(得分:4)
不,因为这不是语法上有效的Java。如果用Integer.class和Double by Double.class替换Integer,它就可以正常工作。但是,我希望这不是你想要的。
在那种情况下,???必须是
Class var
答案 2 :(得分:4)
我认为您正在尝试使用三元布尔运算符来选择变量的引用类型。
这在Java中是不可能的,因为Java是静态类型的 - 这意味着每个类型在编译时都是明确定义的。您的表达式希望运行一个方法并根据其输出确定在编译时不可能的引用类型。
答案 3 :(得分:1)
你可以做类似的事情,但你必须将Integer和Double作为字符串传递给另一个参数,也许是一个构造函数,它将实例化你正在寻找的类型变量。正如你所看到的,这个解决方案需要很多创造力,所以我想你问题的答案越短越正确。
答案 4 :(得分:0)
编辑:我的原始答案是错误的,正如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();
当然,你会在这里丢失确切的子类型,但它至少会编译你想要的。
答案 5 :(得分:0)
您可以使用不同的类型,但必须将结果存储为两者的超类型。所以快速回答是否定的,你不能这样选择引用类型。
最接近它的是将它们存储在最接近的可用超类型中(在本例中为数字):
Number n = functionReturningBoolean() ? 1.0 : 1;
...然后如果你真的想要访问特定于单一类型的东西,请检查并投射。这是令人讨厌的,我想不出一个我在实践中使用它的情况(虽然这不是挖掘,纯粹的学术问题和实际问题一样有效!)
答案 6 :(得分:0)
如果您只是想选择一个类型而不是实例,那么您可以执行以下操作:
Class result = isTrue()? Integer.class | Double.class;