Почему необработанные типы в одном месте приводят к тому, что общие вызовы в другом месте рассматриваются как необработанные? - PullRequest
12 голосов
/ 23 мая 2011
Рассмотрим примерпоэтому мне не нужно объяснять это.

Я хочу узнать более глубокую мотивацию этой «особенности».Почему об этом нет предупреждения erasure?(Существует только одна информация о Foo foo = new Foo().)

Почему при разрешении метода используется стертая семантика, хотя задан общий тип?

Ответы [ 2 ]

5 голосов
/ 23 мая 2011

Это потому, что когда компилятор разрешает перегрузки , он рассматривает каждый метод как универсальный или неуниверсальный, а не как смесь двух, поэтому кандидаты:

  1. Foo<T>.baz(List<String>)
  2. Foo<T>.baz(ArrayList<Object>)

, если foo является Foo<String> или

  1. Foo.baz(List)
  2. Foo.baz(ArrayList)

, если foo является Foo.

Нет такой вещи как Foo.baz(List<String>).Либо все параметры типа учитываются, либо нет.(Мне не известно, что это явно указано в JLS, но это имеет смысл, поскольку обработка универсального метода так, как если бы он был необработанным эквивалентом, является функцией обратной совместимости.)

В первом случае Foo<T>.baz(List<String>) соответствует, но Foo<T>.baz(ArrayList<Object>) не соответствует.

Во втором случае обе функции совпадают, а Foo.baz(ArrayList) является более конкретным , поэтому он выбран.

0 голосов
/ 23 мая 2011

Он даже не скомпилирует case (A), если вы оставите только один метод baz(ArrayList<Object>) (ошибка: метод не может быть применен к данному типу). Я думаю, ArrayList<String> не является подклассом ArrayList<Object>.

Странно, что он компилируется в случае (B), но они, должно быть, приняли некоторые странные решения, чтобы сохранить обратную совместимость с неуниверсальными коллекциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...