首页 > 编程语言 >Java泛型

Java泛型

时间:2022-11-14 10:33:56浏览次数:43  
标签:Java ArrayList Pair second 泛型 public first

Java泛型

简介

在代码中发现了一个没见过没用过的写法,借此复习一下泛型。

public static <T> BaseResponseVo.BaseResponseVoBuilder<T> builder() {
        return new BaseResponseVo.BaseResponseVoBuilder<>();
    }

泛型实际上就是一种模板,从“如果没有泛型会发生什么”的角度来理解,比如经常使用的ArrayList类,如果不用泛型,那么对于类内部的数组只能用Object来修饰,在调用get方法是做强制转换,显然这是不安全的。

ArrayList list = new ArrayList();
list.add("Hello");
// 获取到Object,必须强制转型为String:
String first = (String) list.get(0);

如果我们不希望类型转换,那么对于每一种类型如String,Integer,Double等,都要分别写一个新的类StringArrayList,IntegerArrayList,DoubleArrayList,将类中的数组分别用String,Integer,Double来修饰,这样在调用get的时候就可以确定元素的类型。
然而,这样类的数量太多,也不方便记忆。

因此,Java提供了泛型的方案,将ArrayList变成了一种模板ArrayList,在实现类的时候将所有可能的类型抽象成T,在实例化的时候指定元素的类型。
这样的好处显而易见,使用一个类就可以处理不同类型的元素

// 创建可以存储String的ArrayList:
ArrayList<String> strList = new ArrayList<String>();
// 创建可以存储Float的ArrayList:
ArrayList<Float> floatList = new ArrayList<Float>();
// 创建可以存储Person的ArrayList:
ArrayList<Person> personList = new ArrayList<Person>();

向上转型

在Java代码的书写中,最经常使用的就是List<Integer> list = new ArrayList<>(),即泛型可以向上转型,因为ArrayList的实现是继承自List

public class ArrayList<T> implements List<T> {
    ...
}

但是,另外一种转型是不允许的,即把ArrayList转型为ArrayList

泛型接口

除了ArrayList使用了泛型,还可以在接口中使用泛型。例如,Arrays.sort(Object[])可以对任意数组进行排序,但待排序的元素必须实现Comparable这个泛型接口:

public interface Comparable<T> {
    /**
     * 返回负数: 当前实例比参数o小
     * 返回0: 当前实例与参数o相等
     * 返回正数: 当前实例比参数o大
     */
    int compareTo(T o);
}

比如使用频率较高的pair

class Pair<T> implements Comparable<Pair<T>> {
    T first;
    T second;
    Pair(T first, T second) {
        this.first = first;
        this.second = second;
    }

    @Override
    public int compareTo(Pair o) {
        return (int)this.d - (int)o.d;
    }
}

静态方法

静态方法不能引用泛型类型,必须定义其他类型(例如)来实现静态泛型方法(但实际上类和方法都写T也没事)

public class Pair<T> {
    private T first;
    private T second;
    public Pair(T first, T second) {
        this.first = first;
        this.second = second;
    }
    public T getFirst() { ... }
    public T getLast() { ... }

    // 静态泛型方法应该使用其他类型区分:
    public static <K> Pair<K> create(K first, K second) {
        return new Pair<K>(first, second);
    }
}

究其原因,是静态方法只能通过类来调用
Java的泛型方法属于伪泛型,在编译的时候将进行类型擦除
静态方法由于随着类的加载而加载,不能访问类的泛型(因为在创建对象的时候才确定),因此必须定义自己的泛型类型。
对于Pair<Integer> p = new Pair<>(),在执行的时候T的类型是明确的,但是如Pair.create(1, 2),但此时并不知道T的类型,只能通过多加一个泛型。
到这里就可以解答开篇的疑问了,builder方法是一个静态泛型方法,因此在static后要加一个<T>,在调用的时候,要像下面一样调用

    @ApiOperation(value = "...")
    @GetMapping("...")
    public BaseResponseVo<TaskListVO> getTodoList(@PathVariable Integer sortType,HttpServletRequest request){
        //TODO shiro获取session
        SessionUser sessionUser = (SessionUser)request.getSession().getAttribute("...");
        TaskListDTO taskListDTO = taskDomain.searchCompletedTaskList(sessionUser,sortType);
        MapperFacade mapperFacade = mapperFactory.getMapperFacade();
        TaskListVO result = mapperFacade.map(taskListDTO,TaskListVO.class);
        return BaseResponseVo.<TaskListVO>builder().success(result);
    }

标签:Java,ArrayList,Pair,second,泛型,public,first
From: https://www.cnblogs.com/antidogmatist/p/16888218.html

相关文章

  • 设计模式之【建造者模式】使用java建造者模式优雅创建对象
    文章目录​​什么是建造者模式​​​​一步一步认清建造者模式​​​​1、传统方式创建对象​​​​2、建造者模式创建对象​​​​建造者模式优缺点​​​​建造者模式适用......
  • 一个简单的java awt程序
    现在安卓手机可以java编程了,之前测试了控制台编程是OK的,想测试下gui编程,然后想找个简单的示例测试下都半天找不到,后来自己删删改改弄了一个最简单的,记录一下好以后用:impor......
  • Java可重入锁学习
    概论一个线程获取了某个对象的锁,那么它可以再次获得此对象的锁。这个锁就叫做可重入锁。synchronized就是可重入锁,示例:publicclassLeaningThread{publicstati......
  • 如何设置JavaScript的版本为6
    如何设置JavaScript的版本为6设置里面搜索JavaScript,语言和框架——>JavaScript 使用JavaScript6的好处例如:for循环中可以使用let而不用var//这里出现let是因为Jav......
  • Java反应式编程(1)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 前面把Java函数式编程的由来和最主要的核心知识点讲完了。包括比较难懂的Lambda表达式是怎么演变而来的也全部都撸了一......
  • JavaWeb-新版
    JavaWeb参考文章:https://heavy_code_industry.gitee.io/code_heavy_industry/pro001-javaweb/lecture/01、Web基础概念简介1、服务器与客户端线下的服务器与客户端......
  • Java容器之ArrayList源码分析
    ArrayList概述ArrayList是一种变长的集合类,底层是基于数组来实现的,所以ArrayList查询效率高、增删效率低ArrayList集合中的元素是有序、可重复的,且可以存储null......
  • Java多线程中的ThreadLocal线程本地变量
    概论ThreadLocal指的是开辟一块统一初始化的空间,在这个区域块里每个线程使用的区域独立,互不干扰。一般创建为对象的静态属性。常用方法:set(value)get(value)子类的initia......
  • Java中DCL单例模式设计
    概述单例:某个类,对外永远只有一个对象。实现步骤:/***单例模式:懒汉式套路基础上加入并发控制(synchronized、volatile),保证多线程环境下,对外始终只有一个对象。*1、......
  • JavaWeb笔记(4)
    1.get请求请求方式  get请求的资源路径[+?+请求参数]请求协议版本号  THPP/1.12.请求头key:value组成  不同的键值,表示不同的涵义GET请求的HTTP协议内......