JAVA中基本的泛型语法元素大致有三种:限制泛型可用类型、使得类型通配符,以及泛型的继承。下面将分别对这三种语法进行介绍。
1、限制泛型可用类型
我们在定义泛型类时,默认的是可以使用任何类型来实例化泛型类中的类型持有者。我们也可以指定某种类型,使得此泛型类只能通过这种类型或其子类,或实现这个接口的类来实例化类型持有者。
我们在定义类型持有者时,使用extends关键字来进行限制,例如我们可以这样定义泛型类:
[java]
public class LimitDemo
{
}
public class LimitDemo
{
}这表示类型持有者T所代表的类型必须是一个实现了List接口的类型。所以我们要这样产生LimitDemo类的实例:
[java]
LimitDemo
LimitDemo
[java]
LimitDemo
LimitDemo
编译器就会报出 “String类型不在T范围内” 的错误:
事实上,当我们不用extends关键字来限制泛型类对象时,编译器默认的是Object类下所有的子类都可以实例化类型持有者。即:
[java] view plaincopyprint
public class LimitDemo
public class LimitDemo
[java]
public class LimitDemo
public class LimitDemo
2、类型通配符
如果有一个引用名demo,我们希望demo既能引用WildDemo
不使用通配符的话,我们只能分别定义两个变量,一个是WildDemo
[java]
// 使用通配符 ' '
WildDemo< > demo;
demo = new WildDemo
demo = new WildDemo
// 使用通配符 ' '
WildDemo< > demo;
demo = new WildDemo
demo = new WildDemo
但要注意的是,通过使用类型通配符声明的名称所引用对象,无法对该对象添加信息,只能获取或移除该对象的信息。如下例:
[java]
import java.util.*;
public class WildDemo
{
private T x;
// 为x赋值
public void setX(T x)
{
this.x = x;
}
// 读取x的值
public T getX()
{
return x;
}
public static void main(String[] args)
{
WildDemo
obj.setX(100);
// 使用通配符 ' '
WildDemo< > demo = obj;
demo.getX(); // 读取信息,OK
demo.setX(null); // 移除信息,OK
demo.setX(200); // 设置新的信息给X, ERROR
}
}
import java.util.*;
public class WildDemo
{
private T x;
// 为x赋值
public void setX(T x)
{
this.x = x;
}
// 读取x的值
public T getX()
{
return x;
}
public static void main(String[] args)
{
WildDemo
obj.setX(100);
// 使用通配符 ' '
WildDemo< > demo = obj;
demo.getX(); // 读取信息,OK
demo.setX(null); // 移除信息,OK
demo.setX(200); // 设置新的信息给X, ERROR
}
}
3、泛型类的继承
定义父泛型类:
[java]
class Parent
class Parent
[java]
class Child
class Child
如果子类想保留父类的类型持有者T1,T2,那么父类上所声明的类型持有者的数目在继承下来时必须写全,即class Child
在实际应用中我们使用泛型应该本着简洁易读的原则来定义泛型类,要尽量避免定义有多重<>的复杂泛型。