2013-06-06 4 views
1
public class G<x> { 
    x i; 
} 

public class E { 
    public static void main(String[] args) { 
    G<Integer> b1 = new G<Integer>(); 
    G<String> b2 = new G<String>(); 
    b1.i = 50; 
    b2.i = "start"; 
    System.out.println(b1.i); 
    System.out.println(b2.i); 
    } 
} 

Как этот случай отличается от другого случая приведенного нижепередавая аргумент типа к дженериков

public class G<x> { 
    x i; 
} 

public class E { 
    public static void main(String[] args) { 
    G b1 = new G(); 
    G b2 = new G(); 
    b1.i = 50; 
    b2.i = "start"; 
    System.out.println(b1.i); 
    System.out.println(b2.i); 
    } 
} 

Я знаю Пока вы делаете Объект G класса мы должны определить тип аргумента для generics, но не передавая аргумент типа, он будет работать. Будет показан вывод. Итак, почему мой учитель говорит, что аргумент типа важен, хотя код будет работать и без него.

В обоих случаях есть разница. В первом случае мы передаем аргумент целочисленного типа через ссылочную переменную b1 и аргумент типа String через ссылочную переменную b2, но во втором случае мы этого не делаем. И, не делая этого Во втором случае тип данных будет типом объекта. Оба кода дадут вам один и тот же ответ, но мой учитель говорит, что вам нужно всегда использовать один случай. Так что мой вопрос объясняется тем, почему он так сказал, потому что оба кода дадут вам один и тот же ответ, поэтому почему мы не используем 2 случая

ответ

1

Предполагаю, на самом деле означает это составляет:

G b1=new G(); 
G b2=new G(); 

b1.i=50; 
b2.i="start"; 
System.out.println(b1.i); 
System.out.println(b2.i); 

Это происходит работать PrintStream.println имеет перегрузку Object, поэтому будет использовать какой-либо объект. Обычно вы хотите вызвать более интересный метод.

Кстати, все еще может быть разница. Из-за своеобразного дизайна PrintStream этот код будет делать что-то другое.

G b1=new G(); 
G<char[]> b2=new G<>(); 

b1.i="start".toCharArray(); 
b2.i="start".toCharArray(); 
System.out.println(b1.i); 
System.out.println(b2.i); 

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

+0

этот код отличается от моего. В вашем коде строка 2 даст ошибку, но в моем случае вы не найдете никаких ошибок и exceptio при запуске кода – user2461149

+0

Еще одна вещь G b2 = new G (); , сделав это, вы получите результат. что будет эта строка b1.i = "start" .toCharArray(); дать результат и почему – user2461149

0

Первый случай - тип. В первом случае вы заявили, что b1.i принимает только Integer, поэтому вы не можете по ошибке назначить i.e. String. Вы можете положиться на него, содержащее Integer.

Во втором случае вы можете назначить произвольный потомок объекта в b1.i, чтобы избежать переполнения типов. Вы не можете быть уверены, что b1.i содержит определенный тип.

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