我们对一个类或接口声明中使用了泛型标记,就可以在变量、方法、参数中来约束它。下面是示例代码:
package com.gen.zjc; //泛型学习 import java.util.ArrayList; import java.util.List; //通配符可以用任意字符,但习惯上使用单个大写字母 public class GenericClass<Ha,E> { private static final Class<InnerA> innerA = InnerA.class; private List<Integer> l1; //容器使用泛型 private List<Ha> l2; //普通变量使用泛型 private Ha varh; public Ha getValue(){ return varh; } public void setValue(Ha h){ varh=h; } public GenericClass(){ //容器类使用前要初始化 l1=new ArrayList<Integer>(); l2=new ArrayList<Ha>(); } //参数使用泛型“类” public void test(Class<E> clazz){ System.out.println(clazz.getName()); } static class InnerA{ //xxx内部静态类 } public static void main(String[] args){ //情况1:不对GenericClass做类型限定,其内部容器也不做类型检查 //GenericClass gc=new GenericClass<String,InnerA>(); //情况2:对GenericClass做类型限定,l1的类型也定为List<Integer>,编译器做类型检查 GenericClass<String,InnerA> gc=new GenericClass<String,InnerA>(); gc.setValue("hello"); //情况1:所以List<Integer>类型的l1竟然也接受"abc" //gc.l1.add("abc"); //情况2:List<Integer>类型的l1就只能接受Integer了 gc.l1.add(5); gc.l2.add("Must be a String"); gc.test(innerA); test(gc); } public static void test(GenericClass<String,? extends InnerA> gc){ System.out.println(gc.getValue()); System.out.println(gc.l1.get(0)); System.out.println(gc.l2.get(0)); } }在使用泛型中经常出现的编译器错误: