2016-06-28 52 views
0

我有点困惑ArrayLists和泛型,例如,在下面的程序中,当我声明,Gen<Integer>iOb=new Gen<Integer>(88);它声明一个整数正确的通用类型?但是,如果我以同样的方式声明一个数组列表?在数组列表的情况下,它是尖括号中的类型,但是,研究泛型时,它说尖括号中的类型是泛型类型?我如何知道它是一个类类型或泛型的数组列表?泛型比较。数组列表?

//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); 
    } 
} 
+3

此代码中没有'ArrayList'。 ArrayList是一个类。泛型类。就像“Gen”一样。什么让你感到困扰? – Tunaki

+0

我知道在这段代码中没有arraylist,但是arraylist和generic是以同样的方式声明的,我怎么知道它是泛型还是Gen类型的ArrayList? – Eli

+4

什么是你的“通用”?您是否阅读过https://docs.oracle.com/javase/tutorial/java/generics/? – Tunaki

回答

2

当我宣布,Gen<Integer> iOb = new Gen(88);它宣布为通用整数类型是否正确?

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

Java编译器会记住iOb将引用Gen对象必须持有Integer对象,并会产生对getob()返回值自动型铸造...

int v=iOb.getob(); 

是由解释编译器,就好像下面写着:

int v = (Integer) iObj.getob(); 

getob()被认为只是返回一个Object。请注意,这是编译时转换,以方便程序员。

但是,如果我以同样的方式声明一个数组列表?在数组列表的情况下,它是尖括号中的类型,但是,研究泛型时,它说尖括号中的类型是泛型类型?我怎么知道它是一个类类型或通用的数组列表?

class SomeClass<T> { ... }声明了一个通用类型。尖括号之间的部分是泛型类的“类型参数”。

当泛型类用作变量的类型时,它被认为是泛型类的一种特化,类型参数可以是具体类,接口或其他泛型类。

4

你似乎是混乱一泛型类型的理念和类型参数

鉴于你的类:

class Gen<T> { 
    // ... 
} 

Gen是一个通用类(特定类型的泛型类型的),因为它被声明为具有至少一种类型的参数,在这种情况下T。当你在其他情况下实例化Gen,有时,必须提供绑定到T一个类型表达式:

Gen<?> gen = new Gen<String>(); 

给出的类型表达式(?String)通常也被称为“类型参数”,就像TGen的定义。 具体的类型参数可以由泛型构成(例如:List<String>Gen<List<String>>),但“泛型类”不是“类型参数”的同义词。

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

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

在那里,List<E>ArrayList<E>是通用的类型;后者特别是一个泛型类。两侧的Integer是适用于list声明和ArrayList实例化的类型参数;在这种情况下或任何其他情况下,它不被称为“通用类”。

2

你的问题措辞有点奇怪,但我会给它一个镜头。泛型用于类型安全,特别适用于集合。如果你要这样声明一个ArrayList:

ArrayList a= new ArrayList(); 

然后你可以把任何类型的对象,你想要的ArrayList。这是非常危险的,因为当你从列表中检索对象时,你需要知道你将从列表中检索什么样的对象。你不会想把一个猫对象拉成一个人参考!猫不是人!这是泛型进来的地方。声明你的ArrayList是这样的:

ArrayList<People> p= new ArrayList<People>(); 

允许你有类型安全。这些烦人的猫物体没有更多的问题进入你的人物阵列!

至于这样的:

//get the value in Iob notice that no cast is needed 

int v = iOb.getob(); 

你似乎是与拆箱感到困惑。它与泛型没有任何关系。我建议你查看autboxing和拆箱。

最后:

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

    String str = strOb.getob(); 

我看不出有什么你不明白这里。字符串是对象。你把一个String对象放进去,并且你拉出一个String对象。我也建议创建一个简单的java对象,比如说一个人,这样你就可以用你的Gen类创建一个通用的,比如说String,并且试图将一个Person对象放进去。看看它给出了什么样的错误。

1

首先,我们应该澄清一些条款。从https://docs.oracle.com/javase/tutorial/java/generics/why.html

简而言之,泛型使类型(类和接口)在定义类,接口和方法时成为参数。就像方法声明中使用的更熟悉的形式参数一样,类型参数为您提供了一种方法,让您可以在不同的输入中重用相同的代码。区别在于形式参数的输入是值,而类型参数的输入是类型。

所以,当你做Gen<Integer>iOb=new Gen<Integer>(88);,一个Gen类制成Gen类型,但与一般类型参数IntegerGen是泛型类,因为类头包含泛型类型参数<T>。但是,Arraylists也是泛型类,因为它们不限于一种类型,正如您从声明中可以看出的那样。在声明一个Arraylist时,你可以像你为Gen类一样进行类型声明。例如:Arraylist<String> list = new ArrayList<String>();

Arraylists确实有一个原始类型实现,它不需要声明中的类型参数。例如:Arraylist list = new Arraylist();但这并不推荐,如果您以这种方式声明数组列表,Java实际上会给您一个警告,建议您参数化数组列表。

总之,泛型类型是通过类型参数化的泛型类或接口(https://docs.oracle.com/javase/tutorial/java/generics/types.html)。所以你的Gen类和内置的Arraylist类都是通用类型。