所谓泛型:就是变量类型的参数化。
范型就是很广泛的一种类型<T>它不是JAVA中的一种类型,它打表的是那种类型的信息,你写成<K>等等都是行的.当你不写上范型类别时,那就相当于是List<Object>,也即如果你用<T>时默认是<T extends Object>,学习时如果你看到类似<E>这样,你就把先它当作Object就可以了.
<T extends List>与<? extends List>的区别与联系,前者是声明一个范型时用到,而后者是声明的时候没有用到,当你实例化对象时才用到,即才传进去,举例的代码如下:
前者:
public class ListGenericFoo<T extends List>//声明的时候用了,那么以后你用的时候不管什么时候都限定死了它必须extends List
{
private T[] fooArray;
public T[] getFooArray()
{
return fooArray;
}
public void setFooArray(T[] fooArray)
{
this.fooArray = fooArray;
}
public static void main(String[] args)
{
ListGenericFoo<LinkedList> foo1 = new ListGenericFoo<LinkedList>();
ListGenericFoo<ArrayList> foo2 = new ListGenericFoo<ArrayList>();
LinkedList[] linkedList = new LinkedList[10];
foo1.setFooArray(linkedList);
ArrayList[] arrayList = new ArrayList[10];
foo2.setFooArray(arrayList);
//ListGenericFoo<HashMap> foo3 = new ListGenericFoo<HashMap>();
}
}
后者:
public class GenericTest<T>//在这声明的时候是没有用到的,所以并没有完全限定死
{
private T foo;
public T getFoo()
{
return foo;
}
public void setFoo(T foo)
{
this.foo = foo;
}
public static void main(String[] args)
{
GenericTest<? extends List> ge = null;//在客户端的时候用到
ge = new GenericTest<ArrayList>();
ge = new GenericTest<LinkedList>();
//ge = new GenericTest<HashMap>();
GenericTest<? super List> ge2 = null;
ge2 = new GenericTest<Object>();
GenericTest<String> ge3 = new GenericTest<String>();
ge3.setFoo("hello world");
GenericTest<?> ge4 = ge3;
System.out.println(ge4.getFoo());
ge4.setFoo(null);
System.out.println(ge4.getFoo());
//ge4.setFoo("welcome");不能够这样
//原因:使用<?>或是<? extends SomeClass>的声明方式,意味著您只能通过该名称來取得所参考实例的信息,
或者是移除某些信息,但不能增加它的信息,因为只知道当中放置的是SomeClass的子类,但不确定是什
么类的实例,编译器不让您加入信息,理由是,如果可以加入信息的話,那么您就得記得取回的实例是
什么类型,然后转换为原來的类型方可进行操作,这就失去了使用泛型的意义。
}
}
还有一种用法就是代码里面的GenericTest<? super List> ge2 = null;表示的是要在List上面的即父类以上的才行.