java 泛型类

2022-11-01  本文已影响0人  arkliu

泛型的概念

java泛型,是jdk1.5引入的一个新特性,泛型提供了编译时类型检测机制,该机制允许我们在编译时检测到非法的类型数据结构。

泛型类

泛型类声明语法

class 类名 <泛型标识,泛型标识.....> {
  private 泛型标识 变量名;
}
public class Generic<T> {
    private T key;

    public T getKey() {
        return key;
    }
    public void setKey(T key) {
        this.key = key;
    }
    public Generic(T key) {
        super();
        this.key = key;
    }
    @Override
    public String toString() {
        return "Generic [key=" + key + "]";
    }
}

泛型类使用语法

类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();

jdk1.7之后:
类名<具体的数据类型> 对象名 = new 类名<>();
public class MainClass {

    public static void main(String[] args) {
        Generic<String>strGen = new Generic<>("hello world");
        Generic<Integer>intGen = new Generic<>(100);
        
        // 泛型类不支持基本数据类型
//      Generic<int>intbaseGen = new Generic<>(100); error
        // 泛型类创建对象,没有指定类型,将按照object类型处理
        Generic objGen = new Generic("hello world");
        
        // 泛型类型本质都是相同的类类型
        System.out.println(strGen.getClass()); //class com.test.generic.Generic
        System.out.println(intGen.getClass()); //class com.test.generic.Generic
        System.out.println(objGen.getClass()); //class com.test.generic.Generic
    }
}

泛型类使用

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class ProductGet <T>{
    private T product; //奖品
    Random random = new Random();
    List<T>list = new ArrayList<>(); // 奖品池
    // 添加奖品
    public void addPro(T t) {
        list.add(t);
    }
    // 抽奖
    public T getPro() {
        product = list.get(random.nextInt(list.size()));
        return product;
    }
    
    public static void main(String[] args) {
        ProductGet<String> strProGet = new ProductGet<>();
        String[]strProArr = {"小米pad","华为手机","苹果pad","扫地机器人"};   
        for (int i = 0; i < strProArr.length; i++) {
            strProGet.addPro(strProArr[i]);
        }
        
        String Strpro = strProGet.getPro();
        System.out.println("获得了:"+Strpro);
        
        System.out.println("-----------------");
        ProductGet<Integer>intProGet = new ProductGet<>();
        int[]intProArr = {200, 1000, 3000, 10000};   
        for (int i = 0; i < intProArr.length; i++) {
            intProGet.addPro(intProArr[i]);
        }
        int intPro = intProGet.getPro();
        System.out.println("获得了:"+intPro);
    }
}

泛型类派生子类

1. 子类也是泛型类,子类和父类的泛型类型要一致
class ChildGeneric<T> extends Generic<T>
2. 子类不是泛型类,父类要明确泛型数据类型
class ChildGeneric extends Generic<String>

Parent

public class Parent<T> {
    private T val;

    public T getVal() {
        return val;
    }
    public void setVal(T val) {
        this.val = val;
    }
}

ChildFirst 子类也是泛型类

/**
 * 子类也是泛型类,子类的泛型类型要和父类的泛型类型一致
 * 子类可以进行泛型扩展
 * @param <T> 泛型类型
 */
public class ChildFirst<T,E,K> extends Parent<T> {
    @Override
    public T getVal() {
        return super.getVal();
    }
}

ChildSecond 子类不是泛型类

/**
 * 子类不是泛型类,父类要明确泛型数据类型
 */
public class ChildSecond extends Parent<String> {

    @Override
    public String getVal() {
        return super.getVal();
    }
}

泛型接口

interface 接口名称<泛型标识,泛型标识,....> {
    泛型标识 方法名();
}

1. 实现类不是泛型类,接口要明确数据类型
2. 实现类也是泛型类,实现类和接口的泛型类型要一致
public interface Generic<T> {
    T getKey();
}

public class Generic1Impl implements Generic<String>{

    @Override
    public String getKey() {
        return null;
    }
}
public class Generic2Impl<T> implements Generic<T> {
    @Override
    public T getKey() {
        return null;
    }
}

上一篇下一篇

猜你喜欢

热点阅读