这令我感到困惑,我想要一个解释。
public foo(EventPoint... eventPoints) {
//...
}
boolean isThisHappening;
foo(isThisHappening ? new EventPoint() : new EventPoint[]{});
即使foo(new EventPoint());
有效且foo(new EventPoint[]{});
也有效。这是三元运算符由于类型评估而失败吗?
使用JDK 1.7.0
得到错误:
必需:EventPoint []
发现:对象
reason:参数类型Object不符合vararg元素类型EventPoint
答案 0 :(得分:3)
这是三元运算符失败吗?
三元表达式的类型基本上是最后两个操作数(JLS Reference)中最具体的子类型。 EventPoint
和EventPoint[]
最具体的子类型为Object
。如果你的var-arg方法被声明为接受EventPoint...
,它将无法工作。
你应该改变
foo(state == ItemEvent.SELECTED ? (EventPoint) e.getItem()
: new EventPoint[]{});
到
foo(state == ItemEvent.SELECTED ? new EventPoint[] { (EventPoint) e.getItem() }
: new EventPoint[] { });
它应该编译得很好。
答案 1 :(得分:2)
差不多。您正在组合varargs,这是不受支持的。您可能想要这样称呼它:
foo(isThisHappening? new Object[]{new Object()} : new Object[]{});