首页 > 编程语言 >java 范型

java 范型

时间:2022-10-07 15:26:41浏览次数:45  
标签:范型 Comparable java private second public first

一、范型代码的格式

可以是范型类也可以范型方法

1、范型类

class ClassName<T, ....> {

......ClassName的属性和方法

}

如上跟普通的类相比,增加了<T, ....>

如下是一个简单的Pair的例子,增加了T的类型,则Pair的first和second可以是创建的时候指定的类型

class Pair<T> {
    private T first;
    private T second;

    public Pair() {
        first = null;
        second = null;
    }

    public Pair(T first, T second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public T getSecond() {
        return second;
    }

    public void setFirst(T newValue) {
        first = newValue;
    }

    public void setSecond(T newValue) {
        second = newValue;
    }
}
View Code

如果我们要让first跟second不同类型,可以有多格范型。如下所示

class Pair<T, U> {
    private T first;
    private U second;

    public Pair() {
        first = null;
        second = null;
    }

    public Pair(T first, U second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public U getSecond() {
        return second;
    }

    public void setFirst(T newValue) {
        first = newValue;
    }

    public void setSecond(U newValue) {
        second = newValue;
    }
}
View Code

 

2、范型方法

<T> T Method(T a) {

}

如上跟普通的方法区别是在最前面增加了<T>的限定,告诉Method可以使用T类型

    public static <T> T getMiddle(T... a) {
        return a[a.length / 2];
    }

 

二、有时也需要对范型类型做限定

如果我们对一个参数做比较的时候则该参数的类型需要支持Comparable,那么我们需要对范型类型做限定:<T extends Comparable>

之前我们如果类要遵循协议那么用implements,如果要继承父类则用extends

但是类型的限定全部用extends

那么多继承的话则使用& 进行隔开

    public static <T extends Comparable> T min(T[] a) {
        if (a == null || a.length == 0)
            return null;
        T smallerst = a[0];
        for (int i = 1; i < a.length; ++i) {
            if (smallerst.compareTo(a[i]) > 0)
                smallerst = a[i];
        }

        return smallerst;
    }

如上是对T做限定Comparable,因为有Comparable才能使用compareTo,否则编译器不知道是否有compareTo这个函数

class Interval<T extends Comparable & Serializable> implements Serializable {
    private T lower;
    private T upper;

    public Interval(T first, T second) {
        if (first.compareTo(second) <= 0) {
            lower = first;
            upper = second;
        } else {
            lower = second;
            upper = first;
        }
    }
}
View Code

如上是多个限定

 

三、范型代码和虚拟机

虚拟机没有范型类型对象即所有对象都属于普通类;假设有如下的类,那么虚拟机对应的原始类型是怎样的呢

class Interval<T extends Comparable & Serializable> implements Serializable {
    private T lower;
    private T upper;

    public Interval(T first, T second) {
        if (first.compareTo(second) <= 0) {
            lower = first;
            upper = second;
        } else {
            lower = second;
            upper = first;
        }
    }
}

如上对应的原始类型是

class Interval implements Serializable {
    private Comparable lower;
    private Comparable upper;

    public Interval(Comparable first, Comparable second) {
        if (first.compareTo(second) <= 0) {
            lower = first;
            upper = second;
        } else {
            lower = second;
            upper = first;
        }
    }
}

 

那么如果将Comparable & Serializable改为Serializable & Comparable会发生什么事情呢?

调换之后Interval对应的原始类型则替换为

class Interval implements Serializable {
    private Serializable lower;
    private Serializable upper;

    public Interval(Serializable first, Serializable second) {
        if (((Comparable)first).compareTo(second) <= 0) {
            lower = first;
            upper = second;
        } else {
            lower = second;
            upper = first;
        }
    }
}

在对比的时候会做一次的强转

为了提高效率则应该将接口放在限定列表的末尾。(这句话摘录自java核心技术卷一)

 

标签:范型,Comparable,java,private,second,public,first
From: https://www.cnblogs.com/czwlinux/p/16759779.html

相关文章

  • 物联网开发实战,深入剖析核心技术Java做智慧农业物联网
    物联网开发实战,深入剖析核心技术Java做智慧农业物联网随着国内IT事业的兴起,越来越多的小伙伴也投身到了开发这个相对高薪的行业来。很多同学进入的方式都是零基础通过培训......
  • Java系统架构设计 一线互联网公司架构设计 百度 阿里 腾讯
    原标题:【计算机·干货】阿里,百度,腾讯等一线互联网公司中,Java开发的招聘标准阿里巴巴篇扎实的计算机专业基础,包括算法和数据结构,操作系统,计算机网络,计算机体系结构,数据......
  • Java中List和ArrayList的区别,为什么用接口来引用对象而不是类
    区别用几句话来简单概述就是:1、List是一个接口,而ArrayList是List接口的一个实现类。2、ArrayList类继承并实现了List接口。3、因此,List接口不能被构造,也就是我们说的不能......
  • 基于SSM+Vue企业员工培训管理系统Java公司内部培训系统(源码调试+讲解+文档)
    ......
  • javase复习记录
    为什么重写equals还要重写hashcode?==和equals比较的区别为啥有时会出现4.0-3.6=0.40000001这种现象?final关键字的作用介绍Java的集合类ArrayList和L......
  • JavaScript 学习-48.$.ajaxSetup方法设置AJAX的全局默认设置
    前言$.ajaxSetup方法用于设置AJAX的全局默认设置。之后执行的所有AJAX请求,如果对应的选项参数没有设置,将使用更改后的默认设置。这方便我们设置error统一返回样式。示......
  • javafx
    javafxapplicationJavaFX应用程序从中扩展的应用程序类。JavaFX应用程序的入口点是Application类。每当启动应用程序时,JavaFX运行时都会按顺序执行以下操作:构造指定Ap......
  • Java泛型
    Java泛型本文源自https://www.yuque.com/qingkongxiaguang/javase/syy4rz#29e0f372欢迎大家去看b站这个Up主的Java视频https://www.bilibili.com/video/BV1Gv411T7pi?p=......
  • Java字段初始化的规律
    在Java中定义一个类后,有三种方式可以对其中的变量进行初始化:直接输入,初始化块,构造函数,而对于这三者的优先级,是:1.类的构造函数(构造方法):当创建一个对象时,其构造函数就会......
  • Java静态初始化块的执行顺序
    首先是各个类的静态初始化块先按照先父类后子类的顺序先后执行;然后再次由父类到子类开始依次执行它们的普通初始化块和无参构造器,若是子类初始化中需要为父类传参,那么在执......