自定义泛型
基本语法
class 类名 <T,R.>{/表示可以有多个泛型
成员
}
注意细节
- 普通成员可以使用泛型(属性、方法)
- 使用泛型的数组,不能初始化
- 静态方法中不能使用类的泛型
- 泛型类的类型,是在创建对像时确定的(因为创建对像时,需要指定确定类型)
- 泛型接口的类型,在继承接口或者实现接口时确认
- 如果在创建对象时,没有指定类型,默认为Object
老韩解读
- 如果类名后面有泛型,所以我们把这种类就称为自定义泛型类
- T,R,M泛型的标识符,一般是单个大写字丹
- 泛型标识符可以有多个
- 普通成员可以使用泛型(属性、方法)
- 使用泛型的数组,不能初始化
- 静态方法中不能使用类的泛型(因为在类加载中,无法确认具体类型)
案例
public class Test {
public static void main(String[] args){
//没有指定类型默认为Object
Str str1 = new Str(1,"2");
Str<Integer,String> str2 = new Str<>(1,"2");
System.out.println(str1);
System.out.println(str2);
}
}
class Str<K,V>{
private K key;
private V value;
@Override
public String toString() {
return "Str{" +
"标识符=" + key +
", 值=" + value +
'}';
}
public Str(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
}
自定义泛型接口
基本语法
interface 接口名<T,R...>{
}
注意细节
1、接口中,静态成员也不能使用泛型(这个和泛型类规定一样)
2、泛型接口的类型,在继承接口或者实现接口时确定
3、没有指定类型,默认为Obiect
自定义泛型方法
基本语法
使用自己声明的泛型
修饰符 <T,R...> 返回类型 方法名(参数列表){
}
使用类声明的泛型
class Test<K>
修饰符 返回类型 方法名(K 参数){
}
注意细节
- 泛型方法,可以定义在普通类中,也可以定义在泛型类中
- 当泛型方法被调用时,类型会确定
- public void eat(Ee)},修饰符后没有<T,R.>eat方法不是泛型方法,而是使用了泛型
- 泛型方法,可以定义在普通类中,也可以定义在泛型类中