Почему следующий код Java приводит к ошибке компиляции - PullRequest
1 голос
/ 05 февраля 2012

В настоящее время я работаю над тем, чтобы мой код содержал больше дженериков. Я обнаружил ошибку компиляции, которая выглядит довольно сложной, но которую я смог уменьшить до эквивалентной ошибки в следующем коде:

List<List<?>> a = new ArrayList<List<Integer>>();

Почему это происходит? Что я могу сделать, чтобы это исправить?

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

Экземпляры универсального класса с параметрами другого типа не связаны, т. Е. Даже если String является подтипом Object, List<String> не является подтипом List<Object> и даже List<Integer>подтип List<?>, List<List<Integer>> не является подтипом List<List<?>>.

Возможно, вы ищете

List<? extends List<?>> a = new ArrayList<List<Integer>>();
2 голосов
/ 05 февраля 2012

Две стороны должны совпадать для внутреннего List:

List<List<?>> foo = new ArrayList<List<?>>();
foo.add(new ArrayList<Integer>());

Хотя это довольно глупо, так как вы только что определили список «списков, которые могут содержать что угодно», и если вы точно не знаете, что каждый из них находится в этом внешнем списке, нет способа его предугадать позже из-за стирания типа.

...