2011-08-25 50 views
1

这让我感到困惑,我想要一个解释。可变参数返回对象或数组中的三元运算符无效

public foo(EventPoint... eventPoints) { 
    //... 
} 


boolean isThisHappening; 

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

即使foo(new EventPoint());是有效的,foo(new EventPoint[]{});也是有效的。这是三元操作员由于类型评估而失败吗?

使用JDK 1.7.0 得到的错误:
要求:的eventPoint [] 发现:对象 原因:参数类型对象不符合的eventPoint

+0

错误信息是什么? – aioobe

+0

我在找到java.lang.Object原因参数类型不符合vararg元素类型。更具体地说,它们不是引起问题的Object类型。 – initialZero

+0

发布完整的示例并提供'javac'版本。 'Object'和'Object []'*都是*'Object's,所以听起来很奇怪。 – aioobe

回答

3

Is this the ternary operator failing?

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

,它应该编译就好了。

+0

是的..你确实;-)(它仍然是简化的,因为使用Object .. .'作为参数类型它仍然有效;-)虽然更新了我的答案。 – aioobe

+0

或者,沟三元操作员。 –

+0

这是正确的。但我不明白为什么。为什么其中一个参数被评估为Object? – initialZero

2

差不多VARARG元素类型。你正在结合可变参数,这是不支持的。你可能想这样称呼它:

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

正确的,正如我在我的回答中所说的:-)(除了我用'EventPoint'而不是'Object'。) – aioobe

相关问题