
3.3.3 二义性错误
genmap在声明是使用了2个类型参数t和v, 因此在创建genmap的对象的时候也需要提供2个具体的类类型来替代这2个类型参数, 例如:
清单9, 多个参数的范型类
genmap gm = new genmap();
genmap gm2 = new genmap();
上例中,t和v虽然看起来是两个不同的类型参数,但是在使用这个范型类的时候, t和v很有可能被替换成同一种类型。因此在声明多个类型参数的范型类时, 要注意避免这种二义性错误,例如:
清单10,二义性错误
public class genmap {
//编译错误, 二义性错误
public void set(t t){}
public void set(v v){}
}
在上面这段代码,如果t和v被替换成同一种类型,set函数的签名(signature)就是完全一样的, 所以编译器会报告二义性错误。正确的用法是声明2个不同名的方法, 例如:
清单10, 二义性错误
public class genmap {
public void setkey(t t){}
public void setvalue(v v){}
}

3.3.4 使用通配符
前面我们创建了范型的列表,如果我需要一个方法来处理范型列表,例如, 我们希望把列表中的每个元素都打印出来,但是类型参数(type parameter)只能使用在声明一个范型类的时候,如果类型参数使用在函数定义里会导致编译错误
public static void print(genlist list){} //编译错误
在这种情况下, 我们需要用另外一种方法来表示一个范型类, 否则, 就可能需要书写多个print函数
public static void print(genlist list){}
public static void print(genlist list){}
…
public static void print(genlist list){}
j2se 5.0中提供了范型的通配符"?","?"可以用来代替任何类型, 例如使用通配符来实现print方法
public static void print(genlist list) {}
3.4. 范型的一些局限型
(1) 类型参数不能实例化, 例如,
t t= new t(); //编译错误
(2) 不能实例化类型参数的数组
t[] ts= new t[10]; //编译错误
(3) 类的静态变量不能声明为类型参数类型
public class genclass {
private static t t; //编译错误
}
(4) 范型类不能继承自throwable以及其子类
public genexpection extends exception{} //编译错误
3.5.范型小结
范型是j2se 5.0所提供的一项强大的功能, 使用范型可以创建类型安全的、可重用的代码, 虽然目前java的范型还无法和c++的范型相提并论, 但是, 随着java语言本事的演进, 范型会在java语言中发挥更大的作用的。
闽公网安备 35060202000074号