这令人困惑,我想解释一下。

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)中最具体的子类型。 EventPointEventPoint[]的最具体的子类型是Object。如果您的var-arg方法被声明为接受EventPoint...,则将无法正常工作。

你应该改变

foo(state == ItemEvent.SELECTED ? (EventPoint) e.getItem()
                                : new EventPoint[]{});




foo(state == ItemEvent.SELECTED ? new EventPoint[] { (EventPoint) e.getItem() }
                                : new EventPoint[] { });


它应该可以编译。

09-25 17:25