В следующем тесте TesterClass накладывает ограничение на связь между двумя параметрами своего типа. Метод func2(), похоже, нарушает это ограничение, и я ожидаю, что он вызовет ошибку компиляции при наборе текста где-нибудь (в определении func2 или всякий раз, когда класс используется с любым вторым параметром, кроме String), но это не так!
Кроме того, если я вызову func2 и сохраню результат в переменной с соответствующим типом, компиляция завершится ошибкой (для типа этой переменной). Но сделать то же самое и сохранить в более общем типе (например, Object) удается, несмотря на то, что возвращаемый тип функции должен иметь один и тот же тип в обоих случаях (до приведения).
Что тут происходит?
Спасибо!
public class TestGenerics {
public static class ParamedType<T> {}
public class TesterClass<A extends ParamedType<B>, B> {
public TesterClass<A, B> func() {
return new TesterClass<A, B>();
}
public TesterClass<A, String> func2() {
return new TesterClass<A, String>();
}
}
public Object test() {
// How can I use these type parameters? Doesn't .func2 now have an invalid return type?
TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>();
//TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile
Object res = testClass.func2(); // Compiles
return res;
}
}
EDIT: это не компилируется в javac (версии указаны ниже). Я использую Eclipse и пытаюсь выяснить, какой компилятор на самом деле работает. Будет обновляться. Может быть ошибка JDT (компилятор Eclipse).
Я открыл отчет об ошибке для jdt eclipse: https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503
javac 1.6.0_21
. - person axtavt   schedule 04.01.2011testClass
имеет параметр типаA
изParamedType<Integer>
. Чтобы иметь смысл, тип для левой varres2
должен иметь те же параметры типа, что и func2 (A
=>ParamedType<Integer>
,B
=>String
— в закомментированной строкеString
иInteger
поменяны местами.). Строка по-прежнему не компилируется, но я думаю, что тест имеет больше смысла с этими изменениями. - person Bert F   schedule 04.01.2011res2
- этоTestGenerics
, который не является вашим общим классомTesterClass
. Эти проблемы не связаны с рассматриваемой проблемой, но я хотел указать на опечатки. - person Bert F   schedule 04.01.2011javac 1.7.0_21
и не компилируется (как и ожидалось) - person sinelaw   schedule 03.06.2013