返回对象或数组的varargs中的三元运算符无效

时间:2011-08-25 20:56:40

标签: java

这令我感到困惑,我想要一个解释。

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

2 个答案:

答案 0 :(得分:3)

  

这是三元运算符失败吗?

三元表达式的类型基本上是最后两个操作数(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[] { });

它应该编译得很好。

答案 1 :(得分:2)

差不多。您正在组合varargs,这是不受支持的。您可能想要这样称呼它:

foo(isThisHappening? new Object[]{new Object()} : new Object[]{});