栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java基础 泛型

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java基础 泛型

为什么我们需要泛型

1.适用于多种数据类型执行相同的代码
2.使用了泛型之后在编码的过程中可以指定我们数据类型,而不需要进行强制类型转换以及如果说我们插入错误的数据类型在插入的时候就可以发现。
泛型的定义
参数化的类型。

怎么来定义自己的泛型

泛型类,泛型方法,泛型接口…都是可以的。
泛型类如下

public class NormalGeneric {
    private T data;

    public NormalGeneric(){
    }

//虽然在方法中使用了泛型,但是这并不是一个泛型方法
//这只是类中一个普通的成员方法,只不过他的返回值是在声明泛型类已经声明过的泛型
//所以在这个方法中才可以继续使用T这个泛型
    public T getData(){
        return data;
    }

    
    
    public void setData(T data){
        this.data=data;
    }
    
    public static void main(String[] args){
        NormalGeneric normalGeneric=new NormalGeneric<>();
        normalGeneric.setData("OK");
        System.out.println(normalGeneric.getData());
    }
}

泛型接口

public interface Genertor {
    public T next();
}

如何来实现呢,可以有两种方式

public class ImplGenertor implements Genertor {
    @Override
    public T next() {
        return null;
    }
}

上面的泛型类继承泛型接口,本身和一般的泛型类的实现没有太大差别。如果清楚自己需要的数据类型,可以直接用如下的方式实现。

public class ImplGenertor2 implements Genertor{
    @Override
    public String next() {
        return null;
    }
}

需要注意的是,在普通类里面,同样可以存在需要的泛型方法

public class GenericMethod {
    public  T genericMethod(T...a){
        return a[a.length/2];
    }

    public void test(int x,int y){
        System.out.println(x+y);
    }

    public static void main(String[] args){
        GenericMethod genericMethod=new GenericMethod();
        genericMethod.test(23,123);
        System.out.println(genericMethod.genericMethod("mark","av","lance"));
        System.out.println(genericMethod.genericMethod(12,34,45));
    }
}

如下一个例子,更加深入理解泛型

public class GenericMethod3 {
    static class Fruit{
        @Override
        public String toString(){
            return "fruit";
        }
    }

    static class Apple extends Fruit{
        @Override
        public String toString(){
            return "Apple";
        }
    }

    static class Person{
        @Override
        public String toString(){
            return "Person";
        }
    }

    static class GenerateTest{
        public void show_1(T t){

        }
        
        public  void show_3(E t){
            System.out.println(t.toString());
        }

        
        public  void show_2(T t){
            System.out.println(t.toString());
        }
    }

    public static void main(String[] args){
        Apple apple=new Apple();
        Person person=new Person();

        GenerateTest generateTest=new GenerateTest<>();
        generateTest.show_1(apple);
        generateTest.show_2(person);
        generateTest.show_3(person);
    }

}

限定类型变量
怎么保证执行的泛型的类型下一定会有有某种方法或者遵循某种规则呢?
比如下面的例子,怎么保证一定会有compareTo这个方法呢?

添加如下继承关系

    public static  T min(T a,T b){
        if(a.compareTo(b)>0)
            return a;
        else
            return b;
    }

这个T表示绑定类型的子类型,Comparable则表示绑定类型。
注意,这个限定类型可以是类,也可以是接口,但是如果类与接口混用,类必须写到前面,并且类只能有一个。

public static  T min(T a, T b){
        if(a.compareTo(b)>0)
            return a;
        else
            return b;
    }

泛型类同样适用。
注意:不能实例化类型变量
静态域或者方法里不能引用类型变量
在这里插入图片描述

泛型中的约束和局限性
接着前面那个例子

关于异常情况:

泛型类型的继承规则
例:如果Employee和Worker是继承关系,Pair是一个泛型类,Pair和Pair没有任何继承关系。
泛型类可以继承或者扩展其他泛型类,比如List和ArrayList

通配符类型

public static void print2(Genertor p){
    }
public static void print2(Genertor p){
    }

GenericType x=new GenericType<>();
x.setData(new Apple());
x.setData(new HongFuShi());//Apple的子类
x.setData(new Fruit());//报错,只能set Apple的子类,因为对于setData来说,本身不知道传入的类型,但是Apple以及Apple的子类可以安全的转型为Apple
Object data=x.getData  //返回的是Apple的超类

上面那串代码extends表示传入这个参数的上界只能是Fruit,也就是说传入参数的类型只能是Fruit的子类或者它本身。
而super则规定了下界,传入参数的类型只能是Apple的夫类或本身。
注意如上例子set和get的区别。
extends可以安全的返回数据,super可以安全的写入数据。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/423977.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号