JDK10新特性之var泛型和多个接口实现方法

简介

在JDK10的新特性:本地变量类型var中我们讲到了为什么使用var和怎么使用var。

今天我们来深入的考虑一下var和泛型,多个接口实现的问题。

实现多个接口

在JDK的实现和我们日常的工作中,很多时候都需要实现多个接口,我们举常用的两个例子ArrayList和CopyOnWriteArrayList。先看下他们的定义:

public class ArrayList<E> extends AbstractList<E>
 implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class CopyOnWriteArrayList<E>
 implements List<E>, RandomAccess, Cloneable, java.io.Serializable 

我们可以看到ArrayList和CopyOnWriteArrayList都实现了List,RandomAccess,Cloneable,Serializable这四个接口。

如果我们有一个ArrayList creater,可以创建ArrayList或者CopyOnWriteArrayList中的一个,那么代码应该怎么写呢?

 public Object createList(boolean flag){
 if(flag){
  return new ArrayList<>();
 }else{
  return new CopyOnWriteArrayList<>();
 }
 }

因为返回的值可能是ArrayList也可能是CopyOnWriteArrayList,我们只能以Object来替代要返回的对象。

如果返回了Object就没有了泛型带来的优势,有没有什么方法让我们清楚的知道要返回的对象到底是什么类型的呢?

大家第一个想到的可能就是创建一个新的接口,继承List, RandomAccess, Cloneable, java.io.Serializable,然后createList返回该新创建的接口即可。

public interface ListInterface<E>
extends List<E>, RandomAccess, Cloneable,
java.io.Serializable
{
}

然后把createList方法改写:

public <E> ListInterface<E> createListWithInterface(boolean flag)
{
 if(flag){
  return (ListInterface<E>) new ArrayList<E>();
 }else{
  return (ListInterface<E>) new CopyOnWriteArrayList<E>();
 }
 }

新的方法可以带泛型,并且明确的表明了要返回的是一个ListInterface。

新生成的ListInterface在你自己的代码中使用是没有问题的,考虑一下,如果你的代码被别人引用,或者作为一个公共库来被别人使用,第三方可能根本就不知道你的新创建的ListInterface到底是做什么的。

我们能不能使用一种更加直观的方法来创建List呢?答案当然是可以的,看下面的例子:

public <T extends List<E> & RandomAccess & Cloneable & java.io.Serializable, E>
T createListWithInterfaceT(boolean flag){
 if(flag){
  return (T) new ArrayList<E>();
 }else{
  return (T) new CopyOnWriteArrayList<E>();
 }
 }

上面的例子中,我们使用了泛型T同时继承了4个接口。然后将创建的List转换成T返回。

这样我们即得到了ArrayList和CopyOnWriteArrayList的公共类型,也不需要创建新的接口。

使用多个接口

上面我们创建了一个实现多个接口的泛型T。那么如果要使用它该怎么做呢?

public <T extends List<E> & RandomAccess & Cloneable & java.io.Serializable, E>
 void useGenericityType(){
 VarGenericity varGenericity=new VarGenericity();
 T list=varGenericity.createListWithInterfaceT(true);
 }

为了在方法内部使用T,我们必须在方法定义上面再重新申明一次T的定义。

这么做虽然可以实现我们的功能,但是实在是太麻烦了。

使用var

这个时候就可以使用var变量来替代了,我们看下下面的例子:

public void useVarInGenericityType(){
 VarGenericity varGenericity=new VarGenericity();
 var list=varGenericity.createListWithInterfaceT(true);
 }

是不是很简单,并且var list变量保留了四个接口的所有公共方法。

总结

本文介绍了泛型在多个接口实现中的具体例子,并使用var来精简代码。

本文的例子[ https://github.com/ddean2009/

learn-java-base-9-to-20](https://github.com/ddean2009/ ...

到此这篇关于JDK10新特性之var泛型和多个接口实现方法的文章就介绍到这了,更多相关JDK10 var泛型和多个接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JDK10新特性之本地变量类型var的深入理解

    简介 java以面向对象的特性显著于世并得到了蓬勃的发展.在语言的发展过程中,为了让java语言更加简洁和方便使用,JDK也在不断的进行改进. 今天本文将要介绍一下JDK10中引入的本地变量类型var. 为什么我们需要var 类型推断是很多编程语言都具有的特性,编译器可以在我们不指定具体变量类型的情况下推断出该变量的实际类型. 类型推断的出现,可以让程序员的代码更加灵活,利于维护和编写.其实我们一直都有使用到类型推断. JDK8中引入的lambda表达式就是类型推断的一个非常有用的例子: int

  • JDK10新特性之var泛型和多个接口实现方法

    简介 在JDK10的新特性:本地变量类型var中我们讲到了为什么使用var和怎么使用var. 今天我们来深入的考虑一下var和泛型,多个接口实现的问题. 实现多个接口 在JDK的实现和我们日常的工作中,很多时候都需要实现多个接口,我们举常用的两个例子ArrayList和CopyOnWriteArrayList.先看下他们的定义: public class ArrayList<E> extends AbstractList<E> implements List<E>, R

  • Go1.18新特性使用Generics泛型进行流式处理

    前言 Stream 是一个基于 Go 1.18+ 泛型的流式处理库, 它支持并行处理流中的数据. 并行流会将元素平均划分多个的分区, 并创建相同数量的 goroutine 执行, 并且会保证处理完成后流中元素保持原始顺序. GitHub - xyctruth/stream: A Stream library based on Go 1.18+ Generics (Support Parallel Stream) 安装 需要安装 Go 1.18+ 版本 $ go get github.com/xy

  • 详解Java8新特性之interface中的static方法和default方法

    为什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Collection中的default方法.所以准备专门写写关于java8新特性的文章,虽然现在10已经发布了.但还是要认真的去了解下新版本的变化. static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface

  • JDK9的新特性之String压缩和字符编码的实现方法

    简介 String的底层存储是什么?相信大部分人都会说是数组.如果要是再问一句,那么是以什么数组来存储呢?相信不同的人有不同的答案. 在JDK9之前,String的底层存储结构是char[],一个char需要占用两个字节的存储单位. 据说是JDK的开发人员经过调研了成千上万的应用程序的heap dump信息,然后得出了一个结论:大部分的String都是以Latin-1字符编码来表示的,只需要一个字节存储就够了,两个字节完全是浪费. 据说他们用了大数据+人工智能,得出的结论由不得我们不信. 于是在

  • C# 7.0 新特性1之基于Tuple的“多”返回值方法

    原文链接:http://www.cnblogs.com/ylvict/p/5573094.html 回顾  首先,提出一个问题,C#中,如何使一个方法可返回"多个"返回值?  我们先来回顾一下C#6.0 及更早版本的做法.   在C#中,通常我们有以下4种方式使一个方法返回多条数据. •使用 KeyValue 组合 • static void Main(string[] args) { int int1 = 15; int int2 = 25; var result = Add_Mul

  • Java8新特性之泛型的目标类型推断_动力节点Java学院整理

    简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法的创建中. 理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: List<Apple> box = new ArrayList<Apple>(); box.add(new Apple());Apple apple =box.ge

  • Go1.18新特性之泛型使用三步曲(小结)

    目录 01 Go中的泛型是什么 1.1 传统的函数编写方式 1.2 泛型函数编写方式 02 从泛型被加入之前说起 2.1 针对每一种类型编写一套重复的代码 2.2 使用空接口并通过类型断言来判定具体的类型 2.3 传递空接口并使用反射解析具体类型 2.4 通过自定义接口类型实现 03 深入理解泛型--泛型使用“三步曲” 3.1 第一步:类型参数化 3.2 第二步:给类型添加约束 3.3 第三步:类型参数实例化 04 泛型类型约束和普通接口的区别 总结 01 Go中的泛型是什么 众所周知,Go是一

  • Go1.18新特性工作区模糊测试及泛型的使用详解

    目录 前言 Go工作区模式(Go Workspace Mode) 现实的情况 多仓库同时开发 多个新仓库开始开发 工作区模式是什么 推荐的使用方法 使用时的注意点 Go模糊测试(Go Fuzzing Test) 为什么Golang要支持模糊测试 模糊测试是什么 Golang的模糊测试如何使用 最简单的实践例子 提供自定义语料 使用时的注意点 Go的泛型 类型参数(Type Parameters) 类型集合(Type Sets) 类型推导(Type Inference) 类型统一化(Type Un

  • 详谈Java8新特性泛型的类型推导

    1. 泛型究竟是什么? 在讨论类型推导(type inference)之前,必须回顾一下什么是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法的创建中.理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: List<Apple> box = new ArrayList<Ap

随机推荐