Java 泛型与Arraylist?

Java 泛型与Arraylist?,java,generics,arraylist,Java,Generics,Arraylist,例如,在下面的程序中,当我声明GeniOb=newgen88时,我对ArrayLists和泛型有点困惑;它声明了整数的泛型类型,对吗?但是,如果我以相同的方式声明arraylist?在arraylist的情况下,是尖括号中的类型,但是,在研究泛型时,尖括号中的类型是泛型类型?我如何知道它是类类型的arraylist还是泛型 //A simple generic class //Here, T is a type parameter that ///will be replaced by a r

例如,在下面的程序中,当我声明GeniOb=newgen88时,我对ArrayLists和泛型有点困惑;它声明了整数的泛型类型,对吗?但是,如果我以相同的方式声明arraylist?在arraylist的情况下,是尖括号中的类型,但是,在研究泛型时,尖括号中的类型是泛型类型?我如何知道它是类类型的arraylist还是泛型

//A simple generic class 
//Here, T is a type parameter that
///will be replaced by a real type
//when an object of type gen is created
class Gen<T> {
    T ob;//declare an object of type T

    //Pass the constructor a refernce to
    //an object of type T 
    Gen(T o) {
        ob = o;
    }

    //return ob
    T getob() {
        return ob;
    }

    //show type of t
    void showType() {
        System.out.println("Type of T is " + ob.getClass().getName());
    }
}

class GenDemo {
    public static void main(String[] args) {
        //create a gen reference for integers
        Gen<Integer> iOb;
        //Create a Gen<Integer>Object and assign its 
        //reference to iob, notice the use  of autoboxing
        //to encapsulate the value 88 within an integer object 
        iOb = new Gen<Integer>(88);

        //show the type off data used by iob 
        iOb.showType();
        //get the value in Iob notice that no cast is needed
        int v = iOb.getob();
        System.out.println("Value: " + v);
        System.out.println();
        //create a gen object for strings
        Gen<String> strOb = new Gen<String>("Generic Test");
        //show the type of data 
        strOb.showType();
        //get the value of strOb, again notice that no cast is needed 
        String str = strOb.getob();
        System.out.println("Value  :" + str);
    }
}
当我声明时,geniob=newgen88;它声明了整数的泛型类型,对吗

这是不正确的。您正在声明/创建一个Gen对象,该对象包含一个T extends对象。在Gen代码中,只能使用允许在对象上使用的函数,例如getClass

Java编译器记住iOb将引用必须包含整数对象的Gen对象,并将在getob的返回值上生成自动类型转换

编译器将其解释为编写了以下内容:

int v = (Integer) iObj.getob();
其中getob被认为只是返回一个对象。请注意,这是一个编译时转换,以方便程序员

但是,如果我以相同的方式声明arraylist?在arraylist的情况下,是尖括号中的类型,但是,在研究泛型时,尖括号中的类型是泛型类型?我怎么知道它是类类型的arraylist还是泛型的

类SomeClass{…}声明一个泛型类型。尖括号之间的部分是泛型类的类型参数


当泛型类用作变量的类型时,它被视为泛型类的专门化,类型参数可以是具体类、接口或其他泛型类。

您似乎混淆了泛型类型和类型参数的概念

考虑到你的班级:

class Gen<T> {
    // ...
}
给出的类型表达式是什么?和字符串通常也称为类型参数,就像Gen类定义中的T一样。特定类型参数可以由泛型类构成,例如:Gen中的List,但泛型类不是类型参数的同义词

ArrayList是一样的。它是一个具有一个类型参数的泛型类。特定声明提供类型表达式作为这些类型参数的值:

List<Integer> list = new ArrayList<Integer>();

其中,List和ArrayList是泛型类型;后者特别是泛型类。两边的整数是应用于列表声明和ArrayList实例化的类型参数;在本文或任何其他上下文中,它都不是泛型类。

您的问题措辞有点奇怪,但我会试一试。泛型用于类型安全,尤其是集合。如果要像这样声明ArrayList:

ArrayList a= new ArrayList(); 
ArrayList<People> p= new ArrayList<People>(); 
然后,您可以将任何类型的对象放入ArrayList。这是非常危险的,因为当你从列表中检索对象时,你需要知道你将从列表中检索什么类型的对象。你不会想把一个猫的对象拉到一个人的引用中!猫不是人!这就是泛型的用武之地。如下所示声明您的ArrayList:

ArrayList a= new ArrayList(); 
ArrayList<People> p= new ArrayList<People>(); 
你似乎对拆箱感到困惑。它与泛型无关。我建议您查看装箱和拆箱

最后:

  //get the value of strOb, again notice that no cast is needed

    String str = strOb.getob();
我不明白你有什么不明白的。字符串是对象。你放入一个字符串对象,然后拉出一个字符串对象


我还建议创建一个简单的java对象,比如person,这样您就可以使用Gen类创建一个泛型,比如String,并尝试将person对象放入其中。看看它给出了什么错误。

首先,我们应该澄清一些术语。从

简而言之,泛型使类型、类和接口在定义类、接口和方法时成为参数。与方法声明中使用的更为常见的形式参数非常相似,类型参数为您提供了一种方法,可以对不同的输入重复使用相同的代码。区别在于形式参数的输入是值,而类型参数的输入是类型

所以当你做GeniOb=new Gen88;,Gen类的类型为Gen,但具有泛型类型参数Integer。Gen是泛型类,因为类标头包含泛型类型参数。但是,ArrayList也是泛型类,因为从声明中可以看出,它们不限于一种类型。声明Arraylist时,可以使用与Gen类相同的方法进行类型声明。Ex:Arraylist list=新建Arraylist

ArrayList确实有一个原始类型实现,它在声明中不需要类型参数。Ex:Arraylist list=新建Arraylist;但是不建议这样做,如果您以这种方式声明arraylist,Java实际上会给您一个警告,建议您参数化arraylist

总之,泛型类型是gen
通过类型参数化的eric类或接口。因此,Gen类和Java的内置Arraylist类都是泛型类型。

此代码中没有Arraylist。ArrayList是一个类。泛型类。就像Gen一样,到底是什么困扰着你?我知道在这段代码中没有arraylist,但是arraylist和泛型是以同样的方式声明的,我怎么知道它是泛型还是Gen类型的arraylist?什么是泛型?你读过吗?将Gen称为泛型类型,T称为类型参数,Gen称为参数化类型。@jozencl,听起来,当你说泛型类型时,你是在谈论其他人都称之为原始类型的东西。ArrayList是泛型类型,ArrayList是原始类型。您可以在代码中声明原始类型,例如,您可以声明引用ArrayList的变量,而无需说明ArrayList的内容,但如果您这样做,您将不得不处理大量编译器警告。
  //get the value of strOb, again notice that no cast is needed

    String str = strOb.getob();