2012-06-13 4 views
0

Я использую JDK 1.6
Мой главный метод:Магия Обобщения в Java

exmp3<String , Integer> exmp3 = new exmp3("ravi" , new ArrayList<String>()); 
       exmp3.put(5); 
       exmp3.put(15); 
       exmp3.put(20); 
       ArrayList<Integer> a = exmp3.getObject(); 
       System.out.println(a.size()); 

класс exmp3:

public class exmp3<ABC , XYZ> 
{ 
    private ABC abc ; 
    private ArrayList<XYZ> xyz; 

     public exmp3(ABC abc , ArrayList<XYZ> xyz) 
     { 
      this.xyz = xyz; 
     } 

     public void put(int i) 
     { 
      ArrayList<Integer> a = (ArrayList<Integer>) this.xyz; 
      a.add(i); 
     } 

     public ArrayList<XYZ> getObject() 
     { 
      return xyz; 
     } 
    } 

Мой запрос при создании экземпляра exmp3 в main методе почему String является принятый в качестве параметрического типа ArrayList, где, как я упомянул exmp3<String , Integer> exmp3 в main метод.

+2

Имена классов должны начинаться с прописной буквы :) – Autar

+0

Ьгу оператор бриллианта (в java 7) new exmp3 <> –

+0

ваше объявление класса странно, при использовании дженериков вы должны сначала подумать о том, чего вы ожидаете, и каковы ограничения каждого из ваших общих переменных/методов. проверьте эту версию: http: //pastebin.com/0tD37myU – TecHunter

ответ

1

Потому что вы используете это:

new exmp3("ravi" , new ArrayList<String>()); 

, который почти такой же, как

new exmp3<Object,Object>("ravi" , new ArrayList<String>()); 

Аргументы в методах или конструкторами никогда не определяет типы, когда инстансы. компилятор видит только (если вы не думаете о стирании):

new exmp3(String , ArrayList); 

в то время как ваш экземпляр объявляется использовать это определение:

public class exmp3<Object, Object> 
{ 
    private Object abc ; 
    private ArrayList<Object> xyz; 

     public exmp3(Object abc , ArrayList<Object> xyz) 
     { 
      this.xyz = xyz; 
     } 

     public void put(int i) 
     { 
      ArrayList<Integer> a = (ArrayList<Integer>) this.xyz; 
      a.add(i); 
     } 

     public ArrayList<Object> getObject() 
     { 
      return xyz; 
     } 
    } 
3

Потому что вы используете сырой тип. new exmp3(..) означает, что информация любого типа не учитывается. Измените это на: new Exmp3<String, Integer> (Java 5-6) или new Exmp3<> (Java 7)

Компилятор обычно показывает вам предупреждение в этом случае, что вы не должны использовать необработанные типы. Короче говоря, при использовании raw-типов он работает как Java pre-1.5 - то есть нет дженериков.

+0

не могли бы вы объяснить это больше или предоставить полезный ресурс. –

+0

Я добавил немного больше объяснений. И вот ресурсы http://docs.oracle.com/javase/tutorial/java/generics/erasure.html – Bozho

4

Потому что вы не указываете аргументы типа для вызова конструктора. Либо укажите их явно (new exmp3<String, Integer>(...)), либо вычислите их компилятор (new exmp3<>(...), требуется JDK7 +).

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