0

我正在使用 jdk 1.6
我的主要方法:

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;
        }
    }

我的查询是在创建exmp3inmain方法的实例时为什么String被接受为ArrayListwhere 的参数类型,正如我exmp3<String , Integer> exmp3main方法中提到的那样。

4

3 回答 3

4

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

于 2012-06-13T12:19:42.360 回答
3

因为您使用的是原始类型。new exmp3(..)表示忽略任何类型信息。将其更改为:new Exmp3<String, Integer>(Java 5-6)或new Exmp3<>(Java 7)

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

于 2012-06-13T12:18:57.337 回答
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;
        }
    }
于 2012-06-13T12:28:50.267 回答