Java入门07 - 泛型

1. 什么是泛型?

泛型,即参数化类型 - 将类型由原来的具体类型参数化

类似于方法中的变量参数,此时类型也是参数形式(类型形参、类型实参)

泛型的在不创建新类型的情况下,通过指定不同类型,控制形参具体限制的类型

在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

举个栗子

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

public class Generic{
    public static void main(String [] args){
        List list = new ArrayList();
        list.add("string");
        list.add(100);

        for(int i = 0; i < list.size(); i++){
            // !! Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
            String name = (String) list.get(i);
            System.out.println("name: " + name);
        }
    }
}

上述代码中,ArrayListStringInteger,而两者都以String格式使用,所以出现了错误。
小修,但仍不能实现list.add(100)

List<String> list = new ArrayList<String>();

2. 泛型类

泛型类是拥有一个或者多个类型变量的类
举个栗子

  • 泛型类只能用在成员变量上,并且只能使用引用类型
  • 括号中的T(形式类型参数),可随意指定
  • 当类被使用的时候,要使用具体的实际类型参数
public class Generic{
    public static class Point<T>{
        private T var;

        public void setVar(T x){
            this.var = x;
        }

        public T getVar(){
            return this.var;
        }
    }

    public static void main(String[] args){
        Point<Float> p = new Point<Float>();
        p.setVar(new Float(100.12f));
        System.out.println(p.getVar());
    }
}

3. 泛型方法

  • 类型参数声明:
    • 在方法返回类型前,尖括号分隔
    • 包含一个或多个类型参数,参数间逗号隔开。
  • 返回值类型声明:可用类型参数
  • 泛型参数:也被称为类型变量,用于指定一个泛型类型名称的标识符
  • 方法体声明:和其他方法一样。类型参数只能代表引用型类型,不能是原始类型(int,double,char)
public class GenericMethod {
    int var = 100;
    String varStr = "Hello world";

    public <T> T Method(T a){
        return a;
    }

    public static void main(String[] args){
        GenericMethod m = new GenericMethod();
        System.out.println(m.<Integer>Method(m.var));
        System.out.println(m.<String>Method(m.varStr));
    }
}

4. 泛型接口

interface Info<String>{
    public void setVar(String var);
    public String getVar();
}

class InfoImpl implements Info<String>{
    private String var;
    public InfoImpl(String var){
        this.setVar(var);
    }

    @Override
    public void setVar(String var){
        this.var = var;
    }

    @Override
    public String getVar(){
        return this.var;
    }
}

public class GenericInterface {
    public static void main(String[] args){
        InfoImpl info = new InfoImpl("hahaha");
        System.out.println(info.getVar());
    }
}

5. 类型通配符

  • 类型通配符指在不确定具体参数时,用?代替。
  • ?表示未知类型,给类型参数赋予不确定值,只能用于声明类型、方法参数,不能用于定义泛型类上
import java.util.ArrayList;
import java.util.List;

public class GenericType {
    public static void test(List<?> list){
        List<?> list2;
        list2 = new ArrayList<String>();
        list2 = new ArrayList<Integer>();
        list2 = new ArrayList<Object>();
    }

    public static void main(String[] args){
        test(new ArrayList<String>());
        test(new ArrayList<Integer>());
        test(new ArrayList<Double>());
    }
}

6. 参考资料

Datawhale组队学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值