Почему расширение с подстановочным знаком в качестве универсального параметра не допускается в Java? - PullRequest
0 голосов
/ 17 мая 2018

Мне было интересно, почему нельзя использовать подстановочные знаки в суперклассе java в качестве параметра шаблона. Я столкнулся с этой проблемой, когда несколько раз реализовывал универсальный интерфейс с различными параметрами шаблона, такими как:

interface A<THIS extends A<THIS>> {...}
interface B<THIS extends B<THIS>> {...}
interface C extends A<C> {...}
interface D extends B<D>, C {...}

В этом случае A реализуется два раза с C и D, что приводит к ошибке.

Но в этом особом случае меня не волнует точный тип A и B, когда они расширяются, поэтому было бы здорово использовать ? в качестве параметра, подобного этому:

interface A<THIS extends A<THIS>> {...}
interface B<THIS extends B<THIS>> {...}
interface C extends A<?> {...}
interface D extends B<?>, C {...}

edit : И ни A, ни A<?> не являются жизнеспособным подтудой для A<THIS extends A<THIS>> при его расширении.

Однако на самом деле работало использование raw-типов. Поведение именно то, что я ожидал от групповых символов. И это тоже типоформ.

interface A<THIS extends A<THIS>> {
    THIS foo();
}
interface B<THIS extends B<THIS>> {
    @Overrid THIS foo();
}
interface C extends A {
    @Overrid C foo();
}
interface D extends B, C {
    @Overrid D foo();
}

Конечно, есть предупреждения об использовании raw-типов, но это нормально по сравнению с ошибкой ранее. В чем же разница с использованием подстановочных знаков? Очевидно, что вы не можете установить определенный параметр для групповых символов, таких как T<?,X>. Но для любого типа T<P1,...,Pn> необработанный тип T ведет себя как T<?,...,?>, верно?

...