java泛型基础
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类、接口和方法的创建中, 分别称为泛型类、泛型接口、泛型方法. Java语言引入泛型的好处是安全简单.
今天就从以下几个方面介绍一下java的泛型: 基础, 泛型关键字, 泛型方法, 泛型类和接口.
基础:
通过集合的泛型了解泛型的基本使用
public void testBasis(){
List<String> list = new ArrayList<String>();
// new ArrayList<int>();
} //这是最基本的泛型使用, 就不多说了, 不过要注意的是泛型只能是引用数据类型, 不能是基本类型, 而且泛型只在编译期有效, 在编译后的class文件中是不存在泛型信息的
注意: 泛型只在编译期有效, 在编译后的class文件中是不存在泛型信息的
泛型关键字:
通配符?表示任意引用类型, extends关键字表示子类及其本身, super关键字是表示父类及其本身. 通过一个例子看一下, 解释说明都在例子中
public void testKeyWord() throws Exception {
//实例化参数类型必须指明具体类型
List<?> list = new ArrayList<String>();
//由于list中类型不明确, 所以不能进行添加操作
// list.add("sk"); //通配符?表示任意引用类型
List<List<?>> list1 = new ArrayList<List<?>>();
//list1的参数化类型是一个List, 而这个List也是一个参数化类型, 它的类型是任意类型, 所以list1可以添加任意List类型对象
list1.add(new ArrayList<Object>());
list1.add(new ArrayList<String>()); //实例化list2时指明了类型参数List, 只不过这个List是一个泛型类型
//从这里可以看到关键字extends的用法, 其实就是继承, 如下这里的list2中的参数化类型List(在这里记为paramList)的参数化类型是继承自Number的
//所以在list2在添加的时候只能添加参数化类型为Number及其子类的paramList
List<Integer> l1 = new ArrayList<Integer>();
List<Number> l2 = new ArrayList<Number>();
List<Object> l3 = new ArrayList<Object>();
List<List<? extends Number>> list2 = new ArrayList<List<? extends Number>>();
list2.add(l1);
list2.add(l2);
// list2.add(l3); //这里使用了extends关键字, 所以不能添加Number的父类 //相信大家也猜到了, 既然extends关键字表示子类及其本身, 那么super关键字是表示父类及其本身, 是的, 没错
//和上面的不一样了, l1不能添加, 因为Integer是Number的子类, 并不是Number的父类
List<List<? super Number>> list3 = new ArrayList<List<? super Number>>();
// list3.add(l1); //这里使用了super关键字, 所以不能添加Number的子类
list3.add(l2);
list3.add(l3);
}
泛型方法:
java中任何类型必须先定义才能使用, 泛型也是如此. 既然要使用泛型作为参数, 所以要先定义, 泛型的定义在访问修饰符和返回类型之间, 注意不要掉了尖括号
//无返回值有参的方法, 参数为泛型
public <T> void show(T t){
System.out.println("t-=-=" + t);
} //有返回值的有参方法, 只有一个参数化类型, 这里定义泛型的方式和上面一样, 也是先定义后使用, 只不过这里的返回类型是泛型
public <T> T get(T t){
return t;
} //有返回值的有参方法, 有多个参数化类型, 这里以两个为例
public <T, K> K get(T t, K k){
return k;
} @Test
public void testGeneric() throws Exception {
show(3);
show("generic");
System.out.println("----------------"); System.out.println("我返回Integer类型-" + get(4));
System.out.println("我返回String类型-" + get("returnGeneric"));
System.out.println("------------------"); System.out.println("我返回String类型-" + get(1, "a"));
System.out.println("我返回Integer类型-" + get("b", 2));
}
本来想写无参的泛型方法, 可是写着写着感觉那样没有什么意义, 不知道各位有什么见解.
泛型类和接口:
写泛型类的时候只需要在类名后面加上泛型即可, 就像这样
public class GenericClass<T> {
public T get(T t){
return t;
} public void scr(T t){
System.out.println(t);
} public void show(){
GenericClass<Integer> gc = new GenericClass<Integer>();
// GenericClass<T> gc1 = new GenericClass<T>();
gc.get(3);
gc.scr(5);
//下面2个会报错
// gc1.get(3);
// gc1.scr(5);
}
}
从上面的例子中可以看到, 参数化类型是在创建对象的时候具体化的, 那么除此之外, 还可以再什么时候具体化参数化类型呢?
如果是在继承或实现中, 可以在子类或实现类中确定具体类型
泛型的应用, 请参看使用java泛型设计通用方法
java泛型基础的更多相关文章
- 一个小栗子聊聊JAVA泛型基础
背景 周五本该是愉快的,可是今天花了一个早上查问题,为什么要花一个早上?我把原因总结为两点: 日志信息严重丢失,茫茫代码毫无头绪. 对泛型的认识不够,导致代码出现了BUG. 第一个原因可以通过以后编码 ...
- Java:泛型基础
泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...
- java 泛型基础问题汇总
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引 ...
- 黑马----JAVA泛型基础
黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA范型-基础 一.泛型的概念 1.实现了参数化类型 2.用于编写可应用于多种类型的代码,即所编写的代码可应用于许多许多的类 ...
- java泛型基础、子类泛型不能转换成父类泛型
参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...
- java泛型基础、子类泛型不能转换成父类泛型--未完待续
参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...
- 使用java泛型设计通用方法
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...
- Java基础教程:泛型基础
Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...
- Java基础学习总结(83)——Java泛型总结
1. 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型 ...
随机推荐
- CSS3新特性应用之结构与布局
一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- ios 获取或修改网页上的内容
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌 入页面中,通过这个方法我们可 ...
- IOS之Objective-C学习 ARC下的单例模式
单例模式是我常用的一种设计模式,最常见的用途就是用来保存数据并且传递数据.这都归功于单例模式的特性,首先就让我为大家简单介绍一下单例模式的特性. 单例模式的三大特性: 1.某个类只能有一个实例: 2. ...
- 烂泥:redis3.2.3安装与配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前一段时间写过一篇codis集群的文章,写那篇文章主要是因为当时的项目不支持redis自 ...
- v14.0\AspNet\Microsoft.Web.AspNet.Props 找不到
错误 E:\Github\AutoMapper\src\AutoMapper\AutoMapper.CoreCLR.kproj : error : 未找到导入的项目"C:\Program ...
- JS高级前端开发群加群说明及如何晋级
JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明: 一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...
- mono for android学习过程系列教程(2)
接着上一讲继续开始写,今天介绍的是安卓的基本组成结构. 在大多数情况下,MONO FOR ANDROID的命名空间和Android的命名空间 是互相映射的.有时候需要大小写,非字母数字字符的用法以及名 ...
- 页面与ViewModel(下)
在上一篇博客中,笔者分享了一些从页面整体的角度对页面与ViewModel的思考.在本文中笔者希望从相对细节的角度分享一些对页面与ViewModel的思考. 比如,当我们在更新View Model中的绑 ...
- ABP源码分析十八:UI Inputs
以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的.在当前版本的ABP(0.83)中这些接口和类并没有实际使用到.阅读代码时可以忽略,无需浪费时间 ...