Это меня озадачивает, и я хотел бы получить объяснение.

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

1
initialZero 26 Авг 2011 в 00:56

2 ответа

Лучший ответ

Это тернарный оператор не работает?

Тип тернарного выражения - это, по сути, наиболее конкретный подтип двух последних операндов (Справочник JLS). Наиболее конкретный подтип 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[] { });

И он должен нормально скомпилироваться.

2
aioobe 25 Авг 2011 в 21:12

Довольно много. Вы объединяете varargs, что не поддерживается. Вы можете назвать это так:

foo(isThisHappening? new Object[]{new Object()} : new Object[]{});
2
Anonymous 25 Авг 2011 в 20:59