Почему не допускается перегрузка другим универсальным типом в качестве параметра? - PullRequest
0 голосов
/ 23 сентября 2019

Почему перегрузка с другим универсальным типом в качестве параметра не разрешена в Java?

Например,

private static String convertListToString(List<Character> list)

и

private static String convertListToString(List<String> list) {

вызываетошибка.Почему Java делает это и существуют ли безопасные и популярные обходные пути?

Related

Делает именно то, что мне нужно, но на другом языке - Перегрузкаметод, который принимает общий список с разными типами в качестве параметра

Ответы [ 4 ]

1 голос
/ 23 сентября 2019

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

private static <T> String convertListToString(List<T> list) {
    // Your code here.
}

Внутри тела метода вы можете затем выполнить цикл и вызвать метод toString для обобщенных элементов.

String s = "";

for (int i = 0; i < list.size(); i++) {
    s += list.get(i).toString();
}

return s;
1 голос
/ 23 сентября 2019

Перегрузка метода происходит, когда вы используете то же имя, но изменяете параметры.

Я уверен, что вы знакомы с этим, например:

    void myMethod(int something){
        // implementation
    }

    void myMethod(int something, String somethingElse){
        // implementation
    }

В вашем случае List<String> это не другой тип параметра, чем List<Character>.Универсальный класс определяется как:

List<T>{
  // class implementation, a list that manages objects of type 'T'
}

Редактировать

К обойти это создать универсальный метод, где каждый список типа (List<T>) конвертируетсядо String.Каждый Object имеет метод toString()!

    static <T> String convertToString(List<T> list){
        StringBuilder sb = new StringBuilder();
        // assuming list is not null of course
        for (T item : list) {
            sb.append(item.toString());
        }
        return sb.toString();
    }
0 голосов
/ 23 сентября 2019

Быстрый ответ: так сказано в спецификации. стертый тип используется для разрешения перегрузки.

Обратите внимание, что это проблема времени компиляции .

Нет фундаментальной причины, по которой спецификациине мог быть написан для добавления универсальной информации к перегрузке без добавления информации универсального типа во время выполнения к объектам.Однако это усложнит правила перегрузки, и история обратной совместимости со старым кодом, использующим необработанные типы, не будет такой хорошей.

Как правило, рекомендуется не перегружать методы.Выберите более описательное имя, и если имя особенно сложно, возможно, методы ошибочны.

0 голосов
/ 23 сентября 2019

Ответ: NO .

Типы Generics, например Character и String, в вашем примере существуют только во время компиляции.

Во время выполнения List<Character> и List<String> становятся List<Object>.Java знает об этом и избегает этой ситуации, давая вам ошибку времени компиляции.

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