java泛型

来源:互联网 发布:围住神经猫html5 源码 编辑:程序博客网 时间:2024/05/19 09:12

java的参数化类型被称为泛型(顾名思义,类型用传入参数来确定)

泛型定义类:

只有定义方法时才可以使用数据形参,当调用方法时必须为数据形参传入实际的数据;与此类似,类,接口中的类型形参,只有在定义类,接口时才可以使用类型参数,当使用类,接口时应为类型形参传入实际的类型。

public class B<T extends Number>

public class Apple<T>

public class A extends Apple<T>{}  错误

public class A extends Apple<String> 正确


并不存在泛型类:

List<String> a=new ArrayList<String>();

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

a.getClass()==b.getClass() //  true


因此,类的静态变量和方法在所有实例间共享,所以在静态方法、静态初始化或者静态变量的声明或初始化不允许使用类型形参。

public class R<T>

{  //error

   static T info;

   T  age;

   public void foo(T msg){}

//error

  public static void bar(T msg){}

}


注意:List<String> 不是List<Object>的子类。这就是为啥要有List<?>


类型通配符

前面定义一个类,类型不确定,使用泛型。现在定义一个方法,方法形参是不确定类型的类,例如传入List,具体List<String>,List<Integer>不定。

为了表示各种泛型List父类,我们使用?,称为通配符。可以匹配任何类型。将?作为类型实参传给List集合

public void test(List <?> c)

{   for(int i=0; i< c.size(); i++)

   { System.out.println(c.get(i)); 

   }

}


但这种带有通配符List仅是父类,并不能把元素加入到其中,

List<?> c=new ArrayList<String>();

//error

c.add(new Object());


List<? extends Shape>


泛型方法

如果在定义类,接口没有使用类型形参,但定义方法时想自己定义类型形参,是可以的

static <T> void test(Collection<? extends T> a, Collection<T> c)


泛型方法和类型通配符的区别

对于形参T只使用一次,应该使用通配符,泛型方法允许表示方法参数间类型依赖关系,或者返回值类型与参数关系,如果没有这些关系,不应该使用泛型方法


如果有需要可以同时使用通配符和泛型方法:

public static <T> void copy(List<T> dest,List<? extends T> src){...}

改成泛型方法:

public static <T,S extends T> void copy(List<T> dest,List<S> src){...}



下限 Collection< ? super T>





0 0
原创粉丝点击