Мне было интересно, почему нельзя использовать подстановочные знаки в суперклассе 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<?,...,?>
, верно?