В следующем тесте 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