• 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>
{
//实例属性中可以使用泛型T
private T name; //定义构造器可以使用泛型T
public 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")。

java里程碑之泛型--泛型基本语法的更多相关文章

  1. java里程碑之泛型--泛型注意的几点

    1,泛型的基本语法:类名<具体类> 对象名 = new 类名<具体类>().类型参数规范如下: 1),K键,比如映射的键,key的类型 2),V值,比如Map的值,value类 ...

  2. 剖根问底:Java 不能实现真正泛型的原因是什么?

    大家好,我是二哥呀! 今天我来给大家讲一下,Java 不能实现真正泛型的原因是什么? 本文已同步至 GitHub <教妹学 Java>专栏,风趣幽默,通俗易懂,对 Java 初学者亲切友善 ...

  3. 【原】Java学习笔记027 - 泛型

    package cn.temptation.test; import java.util.ArrayList; import java.util.Iterator; public class Samp ...

  4. Java Collections API和泛型

    Java Collections API和泛型 数据结构和算法 学会一门编程语言,你可以写出一些可以工作的代码用计算机来解决一些问题,然而想要优雅而高效的解决问题,就要学习数据结构和算法了.当然对数据 ...

  5. Java基础教程(21)--泛型

    一.为什么使用泛型   泛型意味着编写的代码可以被很多不同类型的对象所重用.例如,我们不希望为存放String和Integer对象的集合设计不同的类.现在的ArrayList类可以存放任何类型的对象, ...

  6. Java复习——反射和泛型的复习

    反射 Class类 一个类被类加载器加载到内存之中,占有一片区域,这个空间里的内容就是类的字节码,不同的类的字节码是不一样的,这一个个空间页可以使用类来表示,这就是Class类. 根据这个概念可知:不 ...

  7. Java基础教程:泛型基础

    Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...

  8. 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的

    数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...

  9. Java 泛型 泛型的约束与局限性

    Java 泛型 泛型的约束与局限性 @author ixenos 不能用基本类型实例化类型参数 不能用类型参数代替基本类型:例如,没有Pair<double>,只有Pair<Doub ...

  10. Java 泛型 泛型数组

    Java 泛型 泛型数组 @author ixenos 先给结论 不能(直接)创建泛型数组 泛型数组实际的运行时对象数组只能是原始类型( T[]为Object[],Pair<T>[]为Pa ...

随机推荐

  1. CI_SMOKE配置手册

    1.1.  SVN安装 安装TortoiseSVN,并检出AutoScript目录至本地 1.2.  Java环境安装 确认测试环境安装了JDK,在cmd下键入java -version 检查JDK是 ...

  2. UE4中FString转UTF8及UTF8转FString

    FString转UTF8 FString szMsg = "test msg"; TCHAR* pSendData = szMsg.GetCharArray().GetData() ...

  3. windows编程学习笔记(三)ListBox的使用方法

    ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收,并在此消息中处理,并控制子窗口,Lis ...

  4. 找出生成json中的error_code,并加以处理

    需求: 前段时间调用了百度AI的分词接口,因为不完全支持并发,一些调用产生了错误,混在json内部. 现在需要将未调用成功的内容重新调用一遍. 思考过程: 方法一: 开始想到的是调用的过程当中,如果报 ...

  5. Zedboard(一)开发环境Vivado

    Vivado是Xilinx(赛灵思)公司出品的开发软件平台,适用于Zedboard开发板. 下面介绍Vivado搭建的过程: 一.注册Xilinx账号.下载安装包 推荐到Xilinx(赛灵思)英文官网 ...

  6. 关于python使用threadpool中的函数单个参数和多个参数用法举例

    1.对单个元素的函数使用线程池: # encoding:utf-8 __author__='xijun.gong' import threadpool def func(name): print 'h ...

  7. JavaScript练习2

    今天做了一些JS数组的练习题 一.往数组中插入一个数字 var attr = [1,2,3,4,5,6]; var c = 7; for(var i=0;i<attr.length;i++) { ...

  8. sql针对某一字段去重,并且保留其他字段

    今天客户提了一个小需求,希望我能提供一条sql语句,帮助他对数据中 _field 这个字段的值去重,并且保留其他字段的数据.第一反应是select distinct,但这种语句在对某个字段去重时,无法 ...

  9. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  10. poj_1144Network(tarjan求割点)

    poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...