java里程碑之泛型--泛型基本语法
- 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里程碑之泛型--泛型基本语法的更多相关文章
- java里程碑之泛型--泛型注意的几点
1,泛型的基本语法:类名<具体类> 对象名 = new 类名<具体类>().类型参数规范如下: 1),K键,比如映射的键,key的类型 2),V值,比如Map的值,value类 ...
- 剖根问底:Java 不能实现真正泛型的原因是什么?
大家好,我是二哥呀! 今天我来给大家讲一下,Java 不能实现真正泛型的原因是什么? 本文已同步至 GitHub <教妹学 Java>专栏,风趣幽默,通俗易懂,对 Java 初学者亲切友善 ...
- 【原】Java学习笔记027 - 泛型
package cn.temptation.test; import java.util.ArrayList; import java.util.Iterator; public class Samp ...
- Java Collections API和泛型
Java Collections API和泛型 数据结构和算法 学会一门编程语言,你可以写出一些可以工作的代码用计算机来解决一些问题,然而想要优雅而高效的解决问题,就要学习数据结构和算法了.当然对数据 ...
- Java基础教程(21)--泛型
一.为什么使用泛型 泛型意味着编写的代码可以被很多不同类型的对象所重用.例如,我们不希望为存放String和Integer对象的集合设计不同的类.现在的ArrayList类可以存放任何类型的对象, ...
- Java复习——反射和泛型的复习
反射 Class类 一个类被类加载器加载到内存之中,占有一片区域,这个空间里的内容就是类的字节码,不同的类的字节码是不一样的,这一个个空间页可以使用类来表示,这就是Class类. 根据这个概念可知:不 ...
- Java基础教程:泛型基础
Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...
- 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的
数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...
- Java 泛型 泛型的约束与局限性
Java 泛型 泛型的约束与局限性 @author ixenos 不能用基本类型实例化类型参数 不能用类型参数代替基本类型:例如,没有Pair<double>,只有Pair<Doub ...
- Java 泛型 泛型数组
Java 泛型 泛型数组 @author ixenos 先给结论 不能(直接)创建泛型数组 泛型数组实际的运行时对象数组只能是原始类型( T[]为Object[],Pair<T>[]为Pa ...
随机推荐
- 小程序wxss和css3的区别
经过设置发现,微信小程序中wxss并不能完全支持css3的全部功能. 总结记录在此文中,以免忘记. 0 . wxss不能直接通过css3中的background-image属性来设置显示的背景图片. ...
- java 重定向和转发的区别
注:原创链接 http://www.cnblogs.com/shenliang123/archive/2011/10/27/2226892.html response.sendredirect(&q ...
- Springboot(二):Spring Boot 之 HelloWorld
关于项目的创建不再解释,需要了解的请参考: Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程 目录结构: 首先我们在上一项目的 ...
- 9、ABPZero系列教程之拼多多卖家工具 拼团提醒类库封装
本篇开始正式做功能,我在开发拼团提醒之前,拼多多并没有放出拼团人数不足就提醒卖家的功能. 有这个想法主要来源于朋友的抱怨,我想这应该是大部分卖家的心声吧. 经过分析,拿到了几个api,不要问我api怎 ...
- Windows10 环境下安装 ElasticSearch
环境与版本 操作系统:windows 10 Elasticsearch 版本:6.1.1 Java 版本:9.0.1 ik 分词器版本:6.1.1 安装步骤 前置要求 操作系统中需要安装有 java ...
- Inception服务的安装以及使用Python 3 实现MySQL的审计
Inception服务的安装以及使用Python实现MySQL的审计 Bison是Inception服务所依赖的包之一,但是某些Linux版本已安装的Bison,或者是通过yum安装的Bison,通常 ...
- 大数据Hadoop学习之搭建Hadoop平台(2.1)
关于大数据,一看就懂,一懂就懵. 一.简介 Hadoop的平台搭建,设置为三种搭建方式,第一种是"单节点安装",这种安装方式最为简单,但是并没有展示出Hadoop的技术优势,适合 ...
- Javascrip随笔1
isNaN:指示某个值不是数字 文本字符串中使用反斜杠对代码行进行换行; 在计算机程序中,经常会声明无值的变量.未使用值来声明的变量,其值实际上是 undefined.在执行过以下语句后,变量 car ...
- Flume介绍
Flume介绍 http://flume.apache.org/FlumeUserGuide.html 一.Flume架构图 含义 Source 规定收集数据的来源 Channel 相当于一个管道,连 ...
- phpmailer的SMTP ERROR: Failed to connect to server: 10
请问,我在win7上学习使用phpmailer时,出现这种错误怎么处理啊? SMTP ERROR: Failed to connect to server: (0) SMTP connect() fa ...