как java справляется с использованием универсальности и полиморфизма со списком rawtype - PullRequest
0 голосов
/ 31 января 2020

Я изучал списки и универсальность, когда обнаружил следующую проблему

, если у нас есть этот объект (который компилируется с любой ошибкой или предупреждением):

class Thing<TYPE>{
   void add(List<TYPE> ls){...}

   void add(TYPE ls){...}
}

, тогда мы делаем:

Thing<List> thing = new Thing<List>(); //warn about rawtypes but compile
List list=new ArrayList(); //same thing here
thing.add(list); //warn about unsafe cast but compile

как java решает, какой метод вызывать?

я понимаю, что это, вероятно, что-то, чего следует избегать любой ценой по нескольким причинам, но так как он все еще компилируется (по крайней мере, Eclipse сказал это может) мне все еще интересно, как бы он себя вел

1 Ответ

2 голосов
/ 31 января 2020

Java выбирает наиболее конкретную c перегрузку метода.

В этом случае вы вызываете метод с именем add, поэтому у компилятора есть два варианта: add(List) и add(Object) (типы параметров являются необработанными, потому что thing является необработанным).

Если вы передаете необработанный List, это соответствует add(List) и add(Object). add(List) более конкретно c, чем add(Object), потому что есть Object s, которые не List s, но нет List s, которые не Object s.

Таким образом, он выбирает add(List).


Тем не менее, более важная вещь, которую следует учесть, это , что вы не должны использовать необработанные типы, если это вообще возможно .

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