2012-06-13 65 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的参数类型,正如我在main方法中提到的exmp3<String , Integer> exmp3

+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)或​​(Java 7)

在这种情况下,编译器通常会向您显示一条警告,即不应使用原始类型。简而言之 - 当使用原始类型时,它可以像Java 1.5之前的版本一样工作 - 即没有泛型。

+0

可以请你多解释一下,或者提供一个有用的资源。 –

+0

我加了一点解释。这里的资源http://docs.oracle.com/javase/tutorial/java/generics/erasure.html – Bozho

4

因为您没有为构造函数调用指定类型参数。要么明确指定它们(new exmp3<String, Integer>(...)),要么让编译器找出它们(new exmp3<>(...),需要JDK7 +)。