Java泛型使用延伸

jopen 8年前

泛型使用延伸

当创建了带泛型声明的接口,父类之后,可以为该接口创建实现类,或从该父类来派生子类,但值得指出的是,当使用这些接口,父类时不能再包含类型形参。下面代码是错误的:

Public class A extendsApple<T>{}

代码可以改为:

public classRedApple extends Apple<String>{

 

}

如果使用Apple类时没有传入实际的类型参数,Java编译器可能发出警告:使用了未经检查或不安全的操作――这就是泛型检查的警告。可以通过为Javac命令增加-Xlint:unchecked选项来看到详细提示。

不管泛型类型的实际类型参数是什么,它们在运行时总有同样的类(class),并没有生成新的class文件,也不会当作新类来处理。

public static voidmain(String[] args){

          Apple<String> a1 = newApple<String>("Apple");

          System.out.println(a1.getInfo());

          Apple<Double> a2 = newApple<Double>(2.00);

          System.out.println(a2.getInfo());

          System.out.println(a1.getClass()==a2.getClass());

      }

Output:

Apple

2.0

True

泛型对其所有可能的类型参数,都具有同样的行为,从而可以把相同的类当成许多哦不同的类来处理。类的静态变量和方法也在所有的实例间共享,所以在静态方法,静态初始化或者静态变量的声明和初始化中不允许使用类型形参,instanceof也是一样不能跟形参。

如果使用泛型,只要代码在编译时没有出现警告,就不会遇到运行时ClasCastException.

为了表示各种泛型List的父类,我们需要使用类型通配符 – 问号(?), 问号作为类型实参传给List集合,写作Collection<?>,意思是未知类型元素的List。这样不管使用任何类型的 Collection来调用它,都是安全的,因为类型是Object.

import java.awt.Canvas;

 

public abstract class Shape {

    public abstract void draw(Canvas c);

}

 

public classCircle extends Shape{

 

    @Override

    public voiddraw(Canvas c) {

       // TODO Auto-generated method stub

       System.out.println("Circle "+c);

    }

    

}

public classRectangle extends Shape{

 

    @Override

    public voiddraw(Canvas c) {

       // TODO Auto-generated method stub

       System.out.println("Rectangle "+c);

    }

 

}

import java.util.List;

 

public classCanvas {

       public voiddrawAll(List<?> shapes){

           for(Objectobj : shapes){

              Shape s =(Shape)obj;

           }

       }

}

支持泛型的方法:

import java.util.ArrayList;

import java.util.Collection;

 

 

public classTestGenericMethod {

     static<T>voidfromArrayToCollection(T[] a, Collection<T> c){

         for(To:a){

            c.add(o);

         }

         System.out.println(c.size());

     }

     public static voidmain(String[] args){

         Object[] oa = newObject[100];

         Collection<Object>co = new ArrayList<Object>();

         fromArrayToCollection(oa,co);

         String[] str = newString[200];

         Collection<Object>co1 = new ArrayList<Object>();

         fromArrayToCollection(str,co1);

         Double[] dou = newDouble[200];

         Collection<Object>co2 = new ArrayList<Object>();

         fromArrayToCollection(dou,co2);

         Integer[] Inte = newInteger[100];

         Collection<Object>co3 = new ArrayList<Object>();

         fromArrayToCollection(Inte,co3);

     }

}

Output:

100

200

200

100