Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / выбор нужного метода для вызова в контексте генериков / 17 сообщений из 17, страница 1 из 1
10.03.2014, 19:44
    #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
10.03.2014, 20:23
    #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
10.03.2014, 21:19
    #38582542
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор нужного метода для вызова в контексте генериков
Usman,

ну и ... ?

я вроде это даже в вопросе написал, что boxing на втором этапе только случается.....
...
Рейтинг: 0 / 0
10.03.2014, 21:49
    #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
10.03.2014, 21:59
    #38582553
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор нужного метода для вызова в контексте генериков
Usman,

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

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

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

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

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

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

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

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

найти то нашёл, но в полной меое осознать не получается.
...
Рейтинг: 0 / 0
14.03.2014, 12:20
    #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
14.03.2014, 17:01
    #38586618
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор нужного метода для вызова в контексте генериков
Blazkowicz,

всё логично.

Но есть ли способ без .<trololo> явно вызвать нужный метод?
...
Рейтинг: 0 / 0
14.03.2014, 17:07
    #38586635
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор нужного метода для вызова в контексте генериков
redwhite90Но есть ли способ без .<trololo> явно вызвать нужный метод?
Кстати. А попробуй в Java 8, если есть возможность. Там как раз для подобных случаев добавляли более интеллектуальный подбор типов.
...
Рейтинг: 0 / 0
15.03.2014, 15:10
    #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
16.03.2014, 15:34
    #38587530
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор нужного метода для вызова в контексте генериков
Blazkowicz,

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


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