Почему это компилируется? Код, кажется, нарушает ограничения на параметры типа - PullRequest
4 голосов
/ 04 января 2011

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

Ответы [ 2 ]

6 голосов
/ 04 января 2011

Простой ответ: он не компилируется, по крайней мере, в javac 1.7:

Test.java:10: type parameter A is not within its bound
    public TesterClass<A, String> func2() {
                       ^
  where A,B are type-variables:
    A extends ParamedType<B> declared in class Test.TesterClass
    B extends Object declared in class Test.TesterClass
Test.java:11: type parameter A is not within its bound
        return new TesterClass<A, String>();
                               ^
  where A,B are type-variables:
    A extends ParamedType<B> declared in class Test.TesterClass
    B extends Object declared in class Test.TesterClass
2 errors

Вы не сказали, под чем вы его компилировали - я предполагаю, что ваш компилятор Java имеет ошибку вэто.

0 голосов
/ 04 января 2011

По-видимому, это ошибка Eclipse в JDT.core. Я открыл сообщение об ошибке на https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...