У меня есть фрагмент кода, который несовместимо компилируется между Oracle JDK 7 и Eclipse JDT 7, но, поскольку я не уверен, какой компилятор делает ошибку (ошибки), я подумал, что должен спросить мнения здесь, прежде чем отправлять какие-либо отчеты об ошибках.
Это самый простой тест, который я мог придумать, чтобы продемонстрировать несоответствие:
interface Foo<S extends Foo<S, T>, T> {
// should this compile?
public <X extends Foo<S, Y>, Y> Y method1();
// what about this?
public <X extends Foo<? extends S, Y>, Y> Y method2();
}
Oracle JDK выдает ошибку для метода1, но не для метода2, тогда как у Eclipse нет проблем ни с одним из методов. Я даже не уверен, что метод любой должен компилироваться...
Если ни один метод не должен даже компилироваться с самого начала, то следующий вопрос спорный, но я чувствую, что оба компилятора совершают ошибку, если мы добавим следующий код:
interface Bar extends Foo<Bar, Integer> {
}
class Bug {
void bug() {
Bar bar = null;
Double bubble;
// these fail as expected...
bar.<Foo<Bar, Double>, Double> method1();
bar.<Foo<? extends Bar, Double>, Double> method2();
// ...but these don't even though the inferred parametrisations should be
// the same as above
Double bobble = bar.method1();
Double babble = bar.method2();
}
}
Когда мы предоставляем явные параметризации для метода1 и метода2, я не могу найти ни одного, который приводит к действительному вызову, который вернет Double (т.е. я не могу найти допустимую параметризацию для X, когда Y параметризуется с помощью Double). Это поведение, которое я ожидаю, Y здесь должно параметризоваться только с целым числом, насколько я могу видеть.
Однако когда мы позволяем компилятору выводить параметризацию, как Oracle JDK, так и Eclipse JDT разрешают вызов с Y, выведенным как Double. Если вы наведете курсор на вызовы в Eclipse, он даже покажет, что параметризация точно такая же, как наша ручная, которая дает сбой, так почему же такое поведение отличается?
(Причина назначения новым переменным bobble и babble на этом этапе заключается в том, что текст при наведении показывает разные параметризации - по какой-то причине заменяя Double на Object - если мы снова назначаем пузырь. Он по-прежнему компилирует как вызовы, так и присваивает Doubles, хотя , так что я не знаю, почему это.)
Итак, это, возможно, еще один довольно расплывчатый вопрос от меня, но может ли кто-нибудь здесь пролить свет на это для меня?
ИЗМЕНИТЬ:
Отчет об ошибке с Eclipse: https://bugs.eclipse.org/bugs/show_bug.cgi?id=398011
Foo<Bar, ?> fooBar = null; Integer something = fooBar.method1();
- person Elias Vasylenko   schedule 21.12.2012