自定义泛型

自定义泛型

自定义泛型

基本语法

class 类名 <T,R.>{/表示可以有多个泛型
    成员
}

注意细节

  1. 普通成员可以使用泛型(属性、方法)
  2. 使用泛型的数组,不能初始化
  3. 静态方法中不能使用类的泛型
    file
  4. 泛型类的类型,是在创建对像时确定的(因为创建对像时,需要指定确定类型)
  5. 泛型接口的类型,在继承接口或者实现接口时确认
  6. 如果在创建对象时,没有指定类型,默认为Object

老韩解读

  1. 如果类名后面有泛型,所以我们把这种类就称为自定义泛型类
  2. T,R,M泛型的标识符,一般是单个大写字丹
  3. 泛型标识符可以有多个
  4. 普通成员可以使用泛型(属性、方法)
  5. 使用泛型的数组,不能初始化
  6. 静态方法中不能使用类的泛型(因为在类加载中,无法确认具体类型)

案例

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 参数){
    }

注意细节

  1. 泛型方法,可以定义在普通类中,也可以定义在泛型类中
  2. 当泛型方法被调用时,类型会确定
  3. public void eat(Ee)},修饰符后没有<T,R.>eat方法不是泛型方法,而是使用了泛型
  4. 泛型方法,可以定义在普通类中,也可以定义在泛型类中