泛型数据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 种形式。

  1. <?> 被称作无限定的通配符。
  2. <? extends T> 被称作有上限的通配符。
  3. <? 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泛型理解。代码更明了。的更多相关文章

  1. Java泛型理解

    Java泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型.当需要使用某一种算法时,又无法具体算法的数据类型,或者想指定类型值的上限或下限,那么这时就需要Java泛型来大显身手 ...

  2. try-with-resources 让java资源关闭代码更简洁

    一.JDK7的资源关闭方式优化 1 try-with-resource语法 在JDK7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resource语法,才实现了 ...

  3. Java学习笔记(二一)——Java 泛型

    [前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...

  4. 重温Java泛型,带你更深入地理解它,更好的使用它!

    1. 引言 jdk5.0中引入了Java泛型,目的是减少错误,并在类型上添加额外的抽象层. 本文将简要介绍Java中的泛型.泛型背后的目标以及如何使用泛型来提高代码的质量. 2. 为什么要用泛型? 设 ...

  5. 深入理解什么是Java泛型?泛型怎么使用?【纯转】

    本篇文章给大家带来的内容是介绍深入理解什么是Java泛型?泛型怎么使用?有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助. 一.什么是泛型 “泛型” 意味着编写的代码可以被不同类型的对象所 ...

  6. 大白话说Java泛型(二):深入理解通配符

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型(二):深入理解通配符> 上篇文章<大白话说Java泛型(一):入门.原理.使用>,我们讲了泛型的产生缘由以及 ...

  7. Java泛型深入理解(转载)

    原文地址  http://blog.csdn.net/sunxianghuang/article/details/51982979 泛型之前 在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将 ...

  8. Java 泛型 <? super T> 中 super 怎么 理解?与 < ? extends T>有何不同?

    Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? 简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型数组.在泛型的使用中,还有个重要的 ...

  9. Java 干货之深入理解Java泛型

    一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义的类.如果要编写可以应用多中类型的代码,这种刻板的限制对代码得束缚会就会很大. ---<Thinking in Java> ...

随机推荐

  1. uva 10288 Coupons (分数模板)

    https://vjudge.net/problem/UVA-10288 大街上到处在卖彩票,一元钱一张.购买撕开它上面的锡箔,你会看到一个漂亮的图案. 图案有n种,如果你收集到所有n(n≤33)种彩 ...

  2. bzoj 1455: 罗马游戏

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MB Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最 ...

  3. c# 一个关于时间截断的算法取巧

    场景如下: 在某一段时间内(有规律,以一个星期为最大区间),从一个时间区间中排除另外一个或者多个时间区间后,返回时间区间集合. 举例如下: //时间区间:2018-02-01~2018-02-07 / ...

  4. .Net各版本新特性

    序言 C# 1.0 (2002) public interface IDateProvider { DateTime GetDate(); } 隐式接口实现 public class DefaultD ...

  5. 当月第一天、最后一天、下月第一天,时间date

    时间记录,不是时间戳 $thismonth = date('m'); $thisyear = date('Y'); $startDay = $thisyear . '-' . $thismonth . ...

  6. 面试整理(2)跨域:jsonp与CORS

    问题:跨域有哪些方法?jsonp的原理是什么? jsonp: 先说jsonp,jsonp的主要原理是利用script标签的src可以跨域请求,据说有src属性的都可以跨域请求,但script标签返回的 ...

  7. 2017ACM暑期多校联合训练 - Team 6 1002 HDU 6097 Mindis (数学)

    题目链接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , ...

  8. HDU 1214 圆桌会议 (找规律)

    题目链接 Problem Description HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家 ...

  9. ubuntu16.04中启动anaconda图形化界面

    $ source ~/anaconda3/bin/activate root $ anaconda-navigator

  10. AngularJS 指令绑定 & 简介

    指令中独立scope 的 & 官方说明: 1. 绑定表达式 2. 经常用来绑定回调函数 诡异的地方在于,这个 & 某次听人说在子组件中是不能传值给callback的,好奇查了一下官方文 ...