2016-05-12 5 views
0

Выход всегда In OBJECT. поскольку тип возврата недействителен во всех случаях.
Но почему это не происходит в m1 (Integer s)? И без typecasting можно ли перевести вызов в m1 (Integer s)?Понимание метода java generic

package test; 

public class test_class { 

public static void m1(Integer s){ 
    System.out.println("IN INT"); 
} 

public static void m1(Object s){ 
    System.out.println("IN OBJECT");   
} 

public static <Integer> void m2(Integer t){ 
    m1(t); 
} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    test_class.m2(12); 
} 

} 
+1

Что вы думаете '' in 'public static void' does? Почему ты так думаешь? –

+0

-> Разве это не означает, что компилятор должен вызвать m1, который принимает «Integer»? Поскольку Integer является подклассом Object (возможно), я могу понять, почему вызов переходит к Object, но если я удалю m1 (Object s), код не скомпилируется. – akash12300

+0

Это объявление метода. Это ничего не значит. Вы уже узнали об общих методах и о том, как они объявляют общие параметры типа? –

ответ

1

Я, похоже, не понимаю, как работают дженерики, вы как-то смешиваете его с перегрузкой. Если вы объявите общий метод, параметр типа (в вашем случае Integer) будет переменной (часто T). В вашем случае параметр type называется Integer, который каким-то образом вмешивается/затеняет тип аргумента.

Просто удалите <Integer> от m2 и получите ожидаемый результат.

+0

В дополнение к этому вы можете преобразовать переменную, чтобы управлять выполнением правильного метода, например. 'Test.m2 ((Integer) Integer.valueOf (12));' или 'Test.m2 ((Object) Integer.valueOf (12));'. Эта техника называет полиморфизм. –

+0

Я пробовал это. Но он по-прежнему относится к m1 (объект s), однако, если я передам его целому числу внутри определения m2, то он работает. – akash12300

Смежные вопросы