Как получилось, на Java я могу написать
List<?> list = new LinkedList<Double>();
но не
List<Container<?>> list = new LinkedList<Container<Double>>();
где контейнер - это что-то вроде
public class Container<T> { ... }
Это произошло потому, что у меня есть метод, который принимает List<Container<?>>
, и я хотел бы использовать Arrays.asList для передачи ему аргументов:
process(Arrays.asList(new Container<Double>(), new Container<Double>()));
Но язык этого не допускает, потому что он выводит тип Arrays.asList
как List<Container<Double>>
, и это нельзя назначить List<Container<?>>
.
Если я добавлю параметризованный контейнер String к вызову,
process(Arrays.asList(new Container<Double>(), new Container<String>()));
все равно не работает, потому что выводит тип List<Container<? extends Serializable & Comparable<?>>>
для Arrays.asList. Только если я передам что-то, что не является ни Comparable, ни Serializable, оно будет работать правильно.
Конечно, я могу поставить приведение и заставить компилятор замолчать, но мне интересно, делаю ли я здесь что-то не так.