• 1,java7提供的泛型菱形语法

在java7之前,如果使用带泛型的接口和类定义变量初始化对象的时候,构造器后面也必须带上泛型,这有点恶心的。以前我在公司一直使用的java6,所以我也已经习惯了这种写法。代码如下:

List<String> list = new ArrayList<String>();
Map<String, String> map = new HashMap<String, String>();

为了绕开这么恶心的写法,我都习惯用google的common包了。代码如下:

List<String> list = Lists.newArrayList();
Map<String, String> map = Maps.newHashMap();

在java7之后,java允许在构造器后不需要带完整的泛型信息,只要给出一对尖括号就可以,具体的java可以推断出应该是什么泛型信息,上面的代码可以做如下修改:

List<String> list = new ArrayList<>();
Map<String, String> map = new HashMap<>();

上面的代码对原来的泛型并没有任何改变,只是更好的简化了泛型编程。

  • 2,定义泛型接口和类

关于集合使用泛型,这里就不做赘述了。我们可以为任何接口和类增加泛型申明。下面定义一个Test泛型类:

public class Test<T>
{//实例属性中可以使用泛型Tprivate T name;//定义构造器可以使用泛型Tpublic Test(){}public Test(T name){this.name = name;}public T getName(){return name;}public void setName(T name){this.name = name;}public static void main(String[] args){//初始化实例的时候构造器后面的尖括号可以省略Test<String> test1 = new Test<>();test1.setName("LinkinPark...");System.out.println(test1.getName());Test<Integer> test2 = new Test<>();}}

注意:当创建带泛型声明的自定义类时,为该类定义构造器时,构造器还是原来的类名,不可以增加泛型申明。比如说为Test<T>类定义构造器,其构造器名依然是Test,不是Apple<T>。

  • 3,从泛型类派生子类

当创建了带泛型声明的接口和类之后,可以为该接口创建实现类,或从该父类派生子类,需要指出的是,当使用这些接口和父类的时候不能还是泛型形参了。比如,下面的代码报错。

class Test1 extends Test<T>
{
}

如果想从一个接口或者父类派生子类的话,我们应该为T的泛型形参传入实际的类型。正确的写法如下:

class Test1 extends Test<String>
{
}

值得注意的2点:
1,如上面的代码Test1类中,我们继承了Test<String>类,Test中所有使用T类型形参的地方都被替换成了String类型,Test类中原来所有的方法的形参也都变成了具体的类型了。我们在重写父类的方法的时候要特别注意这一点。
比如原来的Test类中有一个方法是:

public T getName()
{
}

我们在重写这个方法时候应该写成

public String getName()
{
}

2,调用方法的时候必须为所有的数据形参传入参数值,和调用方法不同,使用类和接口的时候可以不为类型形参T传入实际的类型参数,这个时候我们就不能写上泛型T标示符了。比如下面的代码也是正确的:

class Test1 extends Test
{}

如果没有为泛型T传入实际的类型参数,Java编译器会发出警告,使用了未经检查或者不安全的操作。此时系统会把类里面的泛型T当做Object来处理。这种写法实际上就是说没有用泛型,实际编码过程中要尽量绕开这种写法。就个人经验而言,每次我看到那个黄色警告的时候都会想办法消除掉,最土的做法就是加注解来抑制警告@SuppressWarnings("rawtypes")。

转载于:https://www.cnblogs.com/LinkinPark/p/5232983.html

java里程碑之泛型--泛型基本语法相关推荐

  1. Java这个高级特性-泛型,很多人还没用过!

    点击关注公众号,Java干货及时送达 泛型是 Java 的高级特性之一,如果想写出优雅而高扩展性的代码,或是想读得懂一些优秀的源码,泛型是绕不开的槛.本文介绍了什么是泛型.类型擦除的概念及其实现,最后 ...

  2. Java基础知识之泛型全接触

    当我们在定义类,接口和方法时,可以接收一个类型作为参数,这就叫做泛型. 函数可以传入普通的参数,也可以传入一个类型参数.不同之处是普通的参数就是值而已,但是类型参数却是个类型. 使用泛型的好处: 强类 ...

  3. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等

    java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...

  4. Java笔记05-Collection、泛型、迭代器

    Java笔记05-Collection.泛型.迭代器 [Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 ...

  5. 0.Java进阶学习之泛型

    1. 什么是泛型? 泛型是Java SE 1.5的新特性. "泛型"意味着编写的代码可以被不同类型的对象所重用. 泛型的本质是参数化类型. 也就是说,泛型是将所操作的数据类型作为参 ...

  6. java集合中的泛型的使用

    -----------------------java集合中的泛型的使用------------------------ 我们在项目中使用集合基本99%都是在集合中存储同一种数据类型.既然我们在集合中 ...

  7. Java基础篇:泛型

    文章目录 1.为什么要有泛型 2.在集合中使用泛型 3.自定义泛型结构 4.泛型在继承上的体现 5.通配符的使用 1.为什么要有泛型 泛型:标签 泛型背后的核心思想就是:把一个集合中的内容限制为一个特 ...

  8. java 静态方法上的泛型

    靜態方法上的泛型 泛型也可以僅定義在靜態方法上,舉例而言,在 定義與使用泛型 中自定義過支援泛型的ArrayList,如果現在想寫個asArrayList方法,可指定不定長度引數,將之轉換為Array ...

  9. Java基础篇:泛型与类型擦除

    一.什么是泛型: 泛型的本质是 参数化类型,也就是说 将所操作的数据类型 指定为一个参数,在不创建新类的情况下,通过参数来指定所要操作的具体类型(类似于方法中的变量参数,此时类型也定义成参数形式),也 ...

  10. yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组

    本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...

最新文章

  1. Spring中property-placeholder的使用与解析
  2. python做图像处理快不快_Python 图像读写谁最快?不信就比一比
  3. Automation Test in Maya Plugin Development
  4. hadoop(9)--MapReduce入门WordCount
  5. VS中的 MD/MT设置 【转】
  6. VC++中Depends工具的使用和DLL函数的动态调用方式示例
  7. Matlab对话框总结
  8. IDEA 2020 配置 Maven 创建 Spring Boot 项目
  9. 从零开始学习ASP.NET MVC1.O (第一章)
  10. 大规模业务技术架构设计与战术(架构师必看)
  11. Android实现传感器应用及位置服务
  12. Netty4.0学习笔记系列之三:构建简单的http服务
  13. ppc手机用蓝牙和电脑同步上网设置教程
  14. 读书百客:《千秋岁·淡烟平楚》赏析
  15. 开源框架Volley的使用《一》
  16. Springboot中@autowired和@resource注解的区别
  17. 部署开源软件snipe-it
  18. JAVA高并发学习笔记(二) 多线程基础
  19. CAD导出PDF线条很粗怎样设置?
  20. python基_python之地基(一)

热门文章

  1. ubuntu 11.10 使用 emacs-23.4 开发 erlang 整理之 安装distel
  2. God of War Ascension / 战神4, 再一次迎来新导演!
  3. java中结构体入参_JNA中自定义结构体如何传参?
  4. [转]使用Git Submodule管理子模块
  5. html5 history解决ajax不能加入历史记录的问题
  6. 百度 UEditor--自定义上传文件路径及读取文件
  7. 云计算和主机托管有哪几点不同?
  8. VS 15 预览 5 中 VB 15 新增的功能
  9. 读取指定文件夹限定文件
  10. 监控 MySQL的多种方法