JAVA泛型

    xiaoxiao2021-03-25  96

    链接:http://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html

    Java中的泛型方法

           泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}。这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类型,例如:Test<Object> t = new Test<Object>();,指明泛型T的类型为Object。

           但是Java中的泛型方法就比较复杂了。

           泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型。

           定义泛型类语法格式如下:

          

           定义泛型对象语法格式如下:

            

           定义泛型方法语法格式如下:

          

           调用泛型方法语法格式如下:

     

           说明一下,定义泛型方法时,必须在返回值前边加一个<T>,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值。

           Class<T>的作用就是指明泛型的具体类型,而Class<T>类型的变量c,可以用来创建泛型类的对象。

           为什么要用变量c来创建对象呢?既然是泛型方法,就代表着我们不知道具体的类型是什么,也不知道构造方法如何,因此没有办法去new一个对象,但可以利用变量c的newInstance方法去创建对象,也就是利用反射创建对象。

           泛型方法要求的参数是Class<T>类型,而Class.forName()方法的返回值也是Class<T>,因此可以用Class.forName()作为参数。其中,forName()方法中的参数是何种类型,返回的Class<T>就是何种类型。在本例中,forName()方法中传入的是User类的完整路径,因此返回的是Class<User>类型的对象,因此调用泛型方法时,变量c的类型就是Class<User>,因此泛型方法中的泛型T就被指明为User,因此变量obj的类型为User。

           当然,泛型方法不是仅仅可以有一个参数Class<T>,可以根据需要添加其他参数。

           为什么要使用泛型方法呢?因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。

    链接:http://www.cnblogs.com/lwbqqyumidi/p/3837629.html

    http://www.cnblogs.com/alsf/p/5690052.html

    泛型是“参数化类型”,相当于调用方法时,把数据类型作为形参传递给实参。

    在方法中,<E>中的E表示类型形参,可以接收具体的类型实参,而无括号的E表示返回类型,即实际参数

    <T> T[] toArray(T[] a);

    E get(int index);

    类型通配符一般是使用 ? 代替具体的类型实参

    getData(Box<?> data) 即调用了getData(Box<?> data)方法时,<?>是一种引用类型,引用类型在传递参数时,实际传递的是一个指针

    还有

    如果使用”?“意味着可以接收任意的内容,但是此内容无法直接使得用”?“修饰的泛型的对象进行修改。如下就会出问题:

    package Thread1; class Info<T>{ private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; } }; public class demo1{ public static void main(String args[]){ Info<?> i = new Info<String>() ; // 使用String为泛型类型 i.setVar("MLDN") ; // 设置内容,这里会出错,因为”?“通配符修饰的对象只能接收,不能修改,也就是不能设置。 } };

    一个类的子类可以通过对象的多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型来接收的。

    class Info<T>{     private T var ;        // 定义泛型变量     public void setVar(T var){         this.var = var ;     }     public T getVar(){         return this.var ;     }     public String toString(){    // 直接打印         return this.var.toString() ;     } }; public class GenericsDemo23{     public static void main(String args[]){         Info<String> i1 = new Info<String>() ;        // 泛型类型为String         Info<Object> i2 = null ;         i2 = i1 ;                  //这里因为对象泛型类型不同,而出错。     } };

    泛型对象在调用方法时,必须与泛型方法中的类型<Object>一致

    转载请注明原文地址: https://ju.6miu.com/read-15366.html

    最新回复(0)