【软件构造】Generics(泛型)


一、泛型含义

参数多态性是指方法针对多种类型时具有同样的行为(这里的多种类型应该具有通用结构),此时可使用统一的类型变量表达多种类型,这就是泛型。
在运行时根据具体指定类型确定具体类型
使用泛型变量的三种形式:泛型类,泛型接口,泛型方法

二、泛型类

1.定义

类中如果声明了一个或多个泛型变量,则成为泛型类。这些类型变量成为类的类型参数。
泛型类的最基本写法如下:

class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{
  private 泛型标识 /*(成员变量类型)*/ var; 
  .....

  }
}

2.例子

代码如下(示例):

public class Example<E> {
  private final E name;
  public Example(E name){
     this.name = name;
  }
  public E getName(){
    return name;
  }
}

在这里Example就是一个泛型类,E就是类型参数
对其进行调用

Example<Integer> exampleInteger = new Example<Integer>(123);
Example<String> exampleString = new Example<String>("vlaue");
System.out.println(exampleInteger.getName);
System.out.println(exampleString.getName);

结果如下

123
vlaue

三、泛型接口

1.定义

如果一个接口声明了一个或多个类型变量,则它是泛型接口。
举个例子

public interface Animal<T>{
  public T now();
}

Animal就是一个泛型接口,T是一个类型变量。

2.实现

2.1 泛型的实现类

class Dog<T> implements Animal<T>{
    @Override
    public T now() {
        return null;
    }
}

2.2 非泛型的实现类

public class Dog implements Animal<String> {

    private String dog = "Peter";

    @Override
    public String now() {
        return dog;
    }
}

四、泛型方法

1.定义

如果一个方法声明了一个或多个类型变量,则它是泛型的。
举个例子


public <T> T genericMethod(Class<T> tClass){
   T instance = tClass.newInstance();
   return instance;
}

1.public 与 返回值中间非常重要,可以理解为声明此方法为泛型方法。
2.只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
3.表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。

2.普通类中的泛型方法

public class GenericTest{
  public <T> T genericMethod(...){
    T var;
    ...;
 }
}

3.泛型类中的泛型方法

举个例子

class GenerateTest<T>{
        //下面的T与泛型类的类型变量一致,show_1不是泛型方法。
        public void show_1(T t){
            System.out.println(t.toString());
        }

        //在泛型类中声明了一个泛型方法,使用泛型E,这种泛型E可以为任意类型。可以类型与T相同,也可以不同。
        public <E> void show_2(E t){
            System.out.println(t.toString());
        }

        //在泛型类中声明了一个泛型方法,使用泛型T,注意这个T是一种全新的类型,可以与泛型类中声明的T不是同一种类型。
        public <T> void show_3(T t){
            System.out.println(t.toString());
        }
    }

对其进行调用

public static void main(String[] args){
  GenericTest<String> genericTest = new GenericTest<>();
  genericTest.show1("genericTest!"); //succeed, "genericTest!" 
  genericTest.show1(Integer.valueOf("1")); //compile error.这是因为泛型类型指定的实参是String,所以当类型为Integer时,报错
  genericTest.show2(Integer.valueOf("1")); //succeed, 1
  genericTest.show2(person); //succeed, maybe name of person
  genericTest.show3(Integer.valueOf("1")); //succeed, 1
  genericTest.show3(person); //succeed, maybe name of person



总结

本文介绍了泛型的三种使用方式,泛型类,泛型接口,泛型方法。在实际使用中,也要多多体会,去尝试用泛型开发,提高代码的可复用性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值