- 泛型的参数必须是类类型,不能是简单类型,如int是不行的,要Integer
- 泛型饿类型个数可以是多个
- 可以使用extends关键字限制泛型的类型
- 可以通配符限制泛型的类型
泛型例子
class Mother<T1> {
T1 t1;
void setT1(T1 t1) {
this.t1 = t1;
}
T1 getT1() {
return this.t1;
}
}
泛型继承
class Son<T1, T2> extends Mother<T1> {
T2 t2;
void setT2(T2 t2) {
this.t2 = t2;
}
T2 getT2() {
return this.t2;
}
}
继承时不指定夫类类型的话,T1会自动变成Object类型
class Mother2<T1> {
T1 t1;
void setT1(T1 t1) {
this.t1 = t1;
}
T1 getT1() {
return this.t1;
}
}
class Son<T2> extends Mother2 {
T2 t2;
void setT2(T2 t2) {
this.t2 = t2;
}
T2 getT2() {
return this.t2;
}
}
// 测试代码
Son2<Integer> son2 = new Son2<>(); // 在创建son2引用的时候,Mother2中的T1自动变成Object类型
son2.setT1("some"); // 可以接收字符串“some”,应为String也是Object的子类
son2.setT2(123);
System.out.println(son2.getT1());
System.out.println(son2.getT2());
限制泛型可用类型
class Limit {
@Override
public String toString() {
return "this is bitson";
}
}
class SubLimit extends Limit {}
class Mother<T1 extends Limit> { // 这里限制类类型T1必须要是Limit类的子类
T1 t1;
void setT1(T1 t1) {
this.t1 = t1;
}
T1 getT1() {
return this.t1;
}
}
class Son<T1 extends Limit, T2> extends Mother<T1> {
//这里继承Mother的时候必须指定T1是Limit类的子类
T2 t2;
void setT2(T2 t2) {
this.t2 = t2;
}
T2 getT2() {
return this.t2;
}
}
// 测试方法中运行如下代码
Son<SubLimit, Integer> son = new Son<>(); // son引用的第一个参数必须是继承类Limit的子类
son.setT1(new SubLimit());
System.out.println(son.getT1());
使用类型通配符:“?”
class Limit {
@Override
public String toString() {
return "this is bitson";
}
}
class SubLimit extends Limit {}
class SubLimit2 extends Limit {}
class Mother<T1 extends Limit> {
T1 t1;
void setT1(T1 t1) {
this.t1 = t1;
}
T1 getT1() {
return this.t1;
}
}
class Son<T1 extends Limit, T2> extends Mother<T1> {
T2 t2;
void setT2(T2 t2) {
this.t2 = t2;
}
T2 getT2() {
return this.t2;
}
}
// 测试代码
Son<? extends Limit, Integer> son = null; // 使用类型通配符的话,可以引用Son<SubLimit, Integer>类型或者是Son<SubLimit2, Integer>()类型的实例
son = new Son<SubLimit, Integer>();
son = new Son<SubLimit2, Integer>();
网友评论