powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / выбор нужного метода для вызова в контексте генериков
17 сообщений из 17, страница 1 из 1
выбор нужного метода для вызова в контексте генериков
    #38582518
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public class Converter {

    public <K> MyContainer<K> pack(K key, String[] values) {
        return new MyContainer<>(key);
    }

    public MyContainer<IntWrapper> pack(Integer key, String[] values) {
        return new MyContainer<>(new IntWrapper(key));
    }


    public static final class MyContainer<T> {
        public MyContainer(T object) { }
    }

    public static final class IntWrapper {
        public IntWrapper(int i) { }
    }


    public static void main(String[] args) {
        Converter converter = new Converter();
        MyContainer<IntWrapper> test = converter.pack(1, new String[]{"Test", "Test2"}); //так можно
        MyContainer<Integer> test = converter.pack(1, new String[]{"Test", "Test2"});//так нельзя
    }
}





кто может объяснить поведение прокомментированное в коде?

P.S. Да я знаю, что
1.можно написать так: converter.<нужный тип>....
2. сначала ищется точный тип, потом boxing/unboxing, потом boxing/unboxing + var args


Вопрос в том почему так?


P.S. украдено отсюда http://stackoverflow.com/questions/18460239/java-generic-method-overloading-ambiguity?rq=1

но видимо знаний в английском не хватило чтобы осознать представленный там ответ.

Рассчитываю на вашу помощь.
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38582528
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90, http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2 The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion,
or the use of variable arity method invocation.

If no applicable method is found during this phase then processing continues to the second phase.
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38582542
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

ну и ... ?

я вроде это даже в вопросе написал, что boxing на втором этапе только случается.....
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38582549
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

Против JLS не попрешь... http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#d5e20240 Here, the most specific declaration of method test is the one taking a parameter of type ColoredPoint. Because the result type of the method is int, a compile-time error occurs because an int cannot be converted to a String by assignment conversion. This example shows that the result types of methods do not participate in resolving overloaded methods, so that the second test method, which returns a String, is not chosen , even though it has a result type that would allow the example program to compile without error. P.S.
Тынц
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38582553
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

Плиз, сформулируйте целиком мысль в связке с моим примером.
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38582563
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

Приоритет перегруженного метода будет выше, если его сигнатура наиболее точно подходит списку фактических параметров.

Способ "намекнуть компилятору на нужный метод по типу возвращаемого значения" - не прокатит, потому что перегрузка так неработает.
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38582581
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

возникает вопрос что значит "наиболее точно"

знаете что будет если заменить
Код: java
1.
String[] values

на
Код: java
1.
String ... 
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38582644
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90знаете что будет если заменитьЧто будет?
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38582713
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

ambigious
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38585772
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

не любишь такое задротство объяснять?
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38585997
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90не любишь такое задротство объяснять?
Обстановка в стране сложная. Много всего навалилось. Ну, а по вопросам, уже нашел раздел JLS где для overload-ов объяснятеся выбор the most specific метода?
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38586095
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

найти то нашёл, но в полной меое осознать не получается.
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38586120
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,
Два метода
Код: java
1.
2.
public Object pack(Object key, String[] values);
public MyContainer pack(Integer key, String[] values);


Очевидно что второй the most specific overload. Понятно почему?

Очевидно что такой вызов линкуется на второй метод.
Код: java
1.
converter.pack(1, new String[]{"Test", "Test2"});


Очевидно?

Соответственно метод возвращает MyContainer<IntWrapper>, который к MyContainer<Integer> не приводится.

Левая часть присвоения никак не может влиять, на то какой из двух методов компилятор выберет в правой части.
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38586618
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

всё логично.

Но есть ли способ без .<trololo> явно вызвать нужный метод?
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38586635
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Но есть ли способ без .<trololo> явно вызвать нужный метод?
Кстати. А попробуй в Java 8, если есть возможность. Там как раз для подобных случаев добавляли более интеллектуальный подбор типов.
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38587156
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczredwhite90Но есть ли способ без .<trololo> явно вызвать нужный метод?
Кстати. А попробуй в Java 8, если есть возможность. Там как раз для подобных случаев добавляли более интеллектуальный подбор типов.

к сожалению возможности нет.

А попробую оправдаться почему я так подумал, что то, что стоит слева в выражении A a = func() может повлиять на то какой перегруженный метод вызовется справа;

Допустим

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class My{
    public static<K,V> Map<K,V> map(){return new HashMap<K,V>();}
}
public class A{
   static void f(Map<String,Integer> bcMap){}
    public static void main(String[] args){
         f(My.map()) //недопустимо
         Map<String,Integer> m = My.map()//допустимо


         //ну естественно и так можно
        f(My.<String,Integer>map());//допустимо
    }
}
...
Рейтинг: 0 / 0
выбор нужного метода для вызова в контексте генериков
    #38587530
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

неубедительно?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / выбор нужного метода для вызова в контексте генериков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]