常规用法:
1.定义泛型类时声明多个类型;
class MutiOverClass<T1,T2>
2.定义泛型时声明数组类型:
class ArrayClass<T>{
private T[] array;
//.....
}
注意,可以在使用泛型机制是声明数组,但是不可以使用泛型来建立数组实例;
例如,//private T[] array=new T[10];是不允许的。
高级用法:
1.限制泛型可用类型。
class LimitClass<T extends Anyclass>,即T只可以是Anyclass的子类,或者实现了Anyclass接口;
class LimitClass<T super Anyclass>, 即T只可以是Anyclass接口或者Anyclass的父类;
2.通配符。
泛型类型名<?extends List>
注意:(1)List与List<?>的区别,使用通配符声明的名称实例化的对象不能对其加入新的信息,只能获取或删除。
(2)
package test;
import java.util.*;
public class Test {
/**
* @param args
*/
public double sum(List<?extends Object>list){
double result=0.0;
for(int i=0;i<list.size();i++){
Object n=list.get(i);
double values=((Number)n).doubleValue();
result+=values;
}
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test a=new Test();
List<Number> list=new ArrayList<Number>();
for(int i=0;i<10;i++)
list.add(i);
double result=a.sum(list);
System.out.println(result);
}
}
public class Test {
/**
* @param args
*/
public double sum(List<Object>list){
double result=0.0;
for(int i=0;i<list.size();i++){
Object n=list.get(i);
double values=((Number)n).doubleValue();
result+=values;
}
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test a=new Test();
List<Number> list=new ArrayList<Number>();
for(int i=0;i<10;i++)
list.add(i);
double result=a.sum(list);
System.out.println(result);
}
}
注意对比上面两段代码,第二段代码是错误的,错误原因:The method sum(List<Object>) in the type Test is not applicable for the arguments (List<Number>)
虽然Number继承了Object但是List<Number>与List<Object>并没有继承关系,所以不存在所谓的向上转型。
虽然Number继承了Object但是List<Number>与List<Object>并没有继承关系,所以不存在所谓的向上转型。