Как использовать несколько подстановочных знаков в вызове API
Я работаю с Anthill (продукт UrbanCode/IBM), и для одного из методов требуется параметр типа java.lang.Class<? extends SourceConfig<?>> sourceConfigType
,
Прочитав учебник по дженерикам, я обнаружил, что класс GitSourceConfig
это подкласс SourceConfig
но я не понимаю, как общий SourceConfig<?>
работает в этом контексте. Есть идеи?
Конечная цель - получить GitSourceConfig
возразить и вызвать getRepositoryUrl
/setRepositoryUrl
методы. Anthill Pro API здесь, и я смотрю на SourceConfig
учебный класс.
2 ответа
Class
является общим - если вы вызываете getClass()
на String
результат объекта будет иметь тип Class<String>
,
В этом случае SourceConfig<R extends Repository>
сам дженерик, так что вы вложили дженерики.
если вы проверите определение GitSourceConfig
public class GitSourceConfig extends SourceConfig<GitRepository>
а также
public class GitRepository extends Repository
так Class<GitSourceConfig>
Матчи Class<? extends SourceConfig<?>>
Общий ограниченный тип подстановочного знака в вашем примере java.lang.Class<? extends SourceConfig<?>> sourceConfigType
указывает, что sourceConfigType
любой класс, который может быть связан верхним пределом типа SourceConfig
,
Из учебника,
List<? extends Shape>
пример ограниченного символа подстановки? обозначает неизвестный тип, точно так же как символы подстановки, которые мы видели ранее. Однако в этом случае мы знаем, что этот неизвестный тип на самом деле является подтипомShape
, (Примечание: это может бытьShape
сам или некоторый подкласс; это не должно буквально расширятьсяShape
.)
Заметка SourceConfig
сам по себе также является общим, и здесь он использует обычный неограниченный подстановочный знак.