java泛型理解。代码更明了。
泛型数据java基础,但真正理解需要悉心品尝。毕竟在工作中用到的是在是太多了。
不要以为new ArrayList<>这就是泛型,这只能属于会使用。
在工作中,相对于现有的项目源码的数据库操作层,无论是mybatis,hibernate或者是自己封装的baseModel层,都会使用到泛型。
以及<? extends T> 和 <? super T>这个屌东西。
泛型使用情况分为三类
1. 泛型类。
2. 泛型方法。
3. 泛型接口。
出于规范的目的,Java 还是建议我们用单个大写字母来代表类型参数。常见的如:
1. T 代表一般的任何类。
2. E 代表 Element 的意思,或者 Exception 异常的意思。
3. K 代表 Key 的意思。
4. V 代表 Value 的意思,通常与 K 一起配合使用。
5. S 代表 Subtype 的意思,文章后面部分会讲解示意。
最直接的一段代码。
List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
System.out.println(l1.getClass() == l2.getClass());
打印的判断为TRUE,因为泛型信息被擦除了。
泛型擦除实例。
List<String> listErasure = new ArrayList<String>() {
// 直接初始化,这也是一种方式。直接传入一个collection。
{add("aaa");add("bbb");}
};
listErasure.add("ccc");
Class<? extends List> class1 = listErasure.getClass();
Method method = class1.getMethod("add",Object.class);
method.invoke(listErasure, 123);
System.out.println(listErasure)
输出结果 [aaa, bbb, ccc, 123]
明明是接收String类型,但是却可以通过反射对其进行Integer类型的操作。
可见泛型只是在编译期间有效。
<?>
代表着类型未知
<? extends T> 和 <? super T>这个东西经常见到,但是并没有字面意义那么简单。
通配符有 3 种形式。
<?>
被称作无限定的通配符。<? extends T>
被称作有上限的通配符。<? super T>
被称作有下限的通配符。
class A{}
class B extends A{}
class C extends B{}
List<? extends B> listExtends = new ArrayList<B>();
// listExtends.add(new A()); 全部编译错误。因为使用的是extends,丧失了写的操作能力。跟f3方法一样,是未知类型,只是确定了里面对象的范围。是B的子类。
// listExtends.add(new B());
// listExtends.add(new C()); // 能进行对B以及B的子类操作。这是super的神奇之处。
List<? super B> listSuper = new ArrayList<B>();
// listSuper.add(new A());//会编译错误。
listSuper.add(new B());
listSuper.add(new C());
以及方法泛型的返回
泛型作为参数的传递。
public static <TTT>TTT f1(TTT t) {
return t;
} // 传递指定的A类型,对应的list可以进行对应的list应有的方法。
public static void f2(List<A> list) {
list.add(new A());
System.out.println(list.size());
} public static void f3(List<?> list) {
// list.add(new A()); //当传入的是?通配符的话表示只能进行跟?无关的操作,类似于size方法,增加代码的可读性。
System.out.println(list.size());
} public static void f4(List<? extends B> listExtends) {
// listExtends.add(new B());//不能进行写做操,因为是?,增加了可读性。
System.out.println(listExtends.size());
}
借鉴文章:泛型,一个孤独的守门者。
测试代码,很全面
package com.javaSE.fanxing; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; class A{}
class B extends A{}
class C extends B{}
public class Demo<T,TT> {
T value;
TT value2;
public TT getValue2() {
return value2;
}
public void setValue2(TT value2) {
this.value2 = value2;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public static <TTT>TTT f1(TTT t) {
return t;
}
// 传递指定的A类型,对应的list可以进行对应的list应有的方法。
public static void f2(List<A> list) {
list.add(new A());
System.out.println(list.size());
}
public static void f3(List<?> list) {
// list.add(new A()); //当传入的是?通配符的话表示只能进行跟?无关的操作,类似于size方法,增加代码的可读性。
System.out.println(list.size());
}
public static void f4(List<? extends B> listExtends) {
// listExtends.add(new B());//不能进行写做操,因为是?,增加了可读性。
System.out.println(listExtends.size());
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
// 打印的判断为TRUE,因为泛型信息被擦除了。
List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();
System.out.println(l1.getClass() == l2.getClass());
// 泛型擦除实例。
List<String> listErasure = new ArrayList<String>() {
// 直接初始化,这也是一种方式。直接传入一个collection。
{add("aaa");add("bbb");}
};
listErasure.add("ccc");
Class<? extends List> class1 = listErasure.getClass();
Method method = class1.getMethod("add",Object.class);
method.invoke(listErasure, 123);
System.out.println(listErasure); Demo<String,Integer> demo = new Demo<String,Integer>();
demo.setValue("string");
System.out.println(demo.getValue()); Demo<Integer,String> demo2 = new Demo<Integer,String>();
demo2.setValue(100);
System.out.println(demo2.getValue()); System.out.println(f1(123));
// List<A> listA = new ArrayList<A>();
// List<B> listB = listA;//new ArrayList<B>();虽然B是A的子类,并不代表泛型之间也具备继承关系。 ArrayList<A> listA = new ArrayList<A>();
listA.add(new A());
f3(listA); // 不对f3方法进行任何操作,是1.
f2(listA); // 2对应的方法实现还进行了一次插入操作。
f3(listA); // static ,对应的listA的集合数量是引用值。 ArrayList<B> listB = new ArrayList<B>();
listB.add(new B());
f3(listB); // f3方法传递的是通配符?,不能进行add操作。 // <? extends T> 和 <? super T>
List<? extends B> listExtends = new ArrayList<B>();
// listExtends.add(new A()); 全部编译错误。因为使用的是extends,丧失了写的操作能力。跟f3方法一样,是未知类型,只是确定了里面对象的范围。是B的子类。
// listExtends.add(new B());
// listExtends.add(new C()); // 能进行对B以及B的子类操作。这是super的神奇之处。
List<? super B> listSuper = new ArrayList<B>();
// listSuper.add(new A());//会编译错误。
listSuper.add(new B());
listSuper.add(new C()); // 没毛病。
List<B> listBS = new ArrayList<B>();
listBS.add(new B());
f4(listBS);
}
}
不要使用JDK中自带的sun.misc.BASE64Decoder这个类去BASE64,这个会在后面多加换行。使用apache中的org.apache.commons.codec.binary.Base64这个类就没问题
java泛型理解。代码更明了。的更多相关文章
- Java泛型理解
Java泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型.当需要使用某一种算法时,又无法具体算法的数据类型,或者想指定类型值的上限或下限,那么这时就需要Java泛型来大显身手 ...
- try-with-resources 让java资源关闭代码更简洁
一.JDK7的资源关闭方式优化 1 try-with-resource语法 在JDK7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resource语法,才实现了 ...
- Java学习笔记(二一)——Java 泛型
[前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...
- 重温Java泛型,带你更深入地理解它,更好的使用它!
1. 引言 jdk5.0中引入了Java泛型,目的是减少错误,并在类型上添加额外的抽象层. 本文将简要介绍Java中的泛型.泛型背后的目标以及如何使用泛型来提高代码的质量. 2. 为什么要用泛型? 设 ...
- 深入理解什么是Java泛型?泛型怎么使用?【纯转】
本篇文章给大家带来的内容是介绍深入理解什么是Java泛型?泛型怎么使用?有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助. 一.什么是泛型 “泛型” 意味着编写的代码可以被不同类型的对象所 ...
- 大白话说Java泛型(二):深入理解通配符
文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型(二):深入理解通配符> 上篇文章<大白话说Java泛型(一):入门.原理.使用>,我们讲了泛型的产生缘由以及 ...
- Java泛型深入理解(转载)
原文地址 http://blog.csdn.net/sunxianghuang/article/details/51982979 泛型之前 在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将 ...
- Java 泛型 <? super T> 中 super 怎么 理解?与 < ? extends T>有何不同?
Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? 简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型数组.在泛型的使用中,还有个重要的 ...
- Java 干货之深入理解Java泛型
一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义的类.如果要编写可以应用多中类型的代码,这种刻板的限制对代码得束缚会就会很大. ---<Thinking in Java> ...
随机推荐
- JS笔记-强化版2
1.DOM: DOM : Document Object Model 文档对象模型 文档:html页面 文档对象:页面中元素 文档对象模型:定义 为了能够让程序(js)去操作页面中的元素 DO ...
- 2017北京国庆刷题Day5 afternoon
期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...
- HDU 2685 GCD推导
求$(a^n-1,a^m-1) \mod k$,自己手推,或者直接引用结论$(a^n-1,a^m-1) \equiv a^{(n,m)}-1 \mod k$ /** @Date : 2017-09-2 ...
- 重构改善既有代码设计--重构手法02:Inline Method (内联函数)& 03: Inline Temp(内联临时变量)
Inline Method (内联函数) 一个函数调用的本体与名称同样清楚易懂.在函数调用点插入函数体,然后移除该函数. int GetRating() { return MoreThanfiveLa ...
- 12款jQuery幻灯片插件和幻灯片特效教程
jQuery 使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入一些非常好的效果.滑块和幻灯片效果是常用的内容展示方式之一,这是一种在有限的网页空间内展示系列项目时非常好的方法.今 ...
- Lua的工具资源3
[LuaSrcDiet] (5.0.2) - 通过删除不必要的空白和注释缩减Lua文件的大小. [LuaProfiler] (5.0) - 一个用来查找Lua应用瓶颈的工具time profiler ...
- 51nod1056 最长等差数列 V2
基准时间限制:8 秒 空间限制:131072 KB 分值: 1280 N个不同的正整数,从中选出一些数组成等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括 ...
- 【译】Attacking XML with XML External Entity Injection (XXE)
原文链接:Attacking XML with XML External Entity Injection (XXE) XXE:使用XML外部实体注入攻击XML 在XML中,有一种注入外部文件的方式. ...
- Codeforces 870E Points, Lines and Ready-made Titles 计数
题目链接 题意 给定二维坐标上的\(n\)个点,过每个点可以 画一条水平线 或 画一条竖直线 或 什么都不画,并且若干条重合的直线被看做同一条.问共可能得到多少幅不同的画面? 题解 官方题解 仆の瞎扯 ...
- anychat安装
1.下载后,解压到一个目录 2.进入anychat核心服务器目录,并启动 ①.cd %anychat安装路径%/binrver ②../anychatcoreserver -d 3.进 ...