这令人困惑,我想解释一下。
public foo(EventPoint... eventPoints) {
//...
}
boolean isThisHappening;
foo(isThisHappening ? new EventPoint() : new EventPoint[]{});
即使
foo(new EventPoint());
有效并且foo(new EventPoint[]{});
也有效。这是由于类型评估而导致的三元运算符失败?使用JDK 1.7.0
得到错误:
必需:EventPoint []
找到:对象
原因:参数类型对象不符合vararg元素类型EventPoint
最佳答案
这是三元运算符失败了吗?
三元表达式的类型基本上是最后两个操作数(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[] { });
它应该可以编译。