1 泛型demo
1.1 泛型____类demo
泛型主类:
package com.ddwei.fanxing; public class Pair<T> { private T first; private T second; public T getFirst() { return first; } public void setFirst(T first) { this.first = first; } public T getSecond() { return second; } public void setSecond(T second) { this.second = second; } public Pair() { first = null; second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } }
String处理类:
package com.ddwei.fanxing; public class ArrayAlg { public static Pair<String> minmax(String[] a){ if(a==null || a.length == 0) return null; String min = a[0]; String max = a[0]; for(int i = 1; i < a.length; i++){ if(min.compareTo(a[i]) > 0) min = a[i]; if(max.compareTo(a[i]) < 0) max = a[i]; } return new Pair(min,max); } }
int处理类:
package com.ddwei.fanxing; public class ArrayAlg2 { public static Pair<Integer> minmax(int[] a){ if(a==null || a.length == 0) return null; Integer min = a[0]; Integer max = a[0]; for(int i = 1; i < a.length; i++){ if(min.compareTo(a[i]) > 0) min = a[i]; if(max.compareTo(a[i]) < 0) max = a[i]; } return new Pair(min,max); } }
测试类:
package com.ddwei.fanxing; public class PairTest1 { public static void main(String[] args) { String [] words = {"Mary", "had", "A", "little", "lamp" }; Pair<String> mm = ArrayAlg.minmax(words); System.out.println("min = "+ mm.getFirst()); System.out.println("max = "+ mm.getSecond()); int [] number = {5, 9, 1, 7, 2}; Pair<Integer> mm2 = ArrayAlg2.minmax(number); System.out.println("min = "+ mm2.getFirst()); System.out.println("max = "+ mm2.getSecond()); } }
1.2 泛型____方法demo
功能:取出中间元素
package com.ddwei.fanxing2; public class ArrayAlg { //...代表多个传参数 public static <T>T getMiddle(T... a){ return a[a.length/2]; } public static void main(String[] args) { //String middle = ArrayAlg.getMiddle("aaa","ccc","bbb","dddd"); System.out.println(ArrayAlg.getMiddle("Hello", null, 4)); //System.out.println(middle); } }
1.3 泛型____类型变量限定demo
功能:compareto会有编译错误,为了避免这种情况,需要限定T实现Comparable接口
package com.ddwei.fanxing3; public class ArrayAlg { public static <T extends Comparable>T min (T[] t){ if(t == null || t.length ==0){ return null; } T min = t[0]; for(int i = 1;i < t.length;i++){ if(min.compareTo(t[i]) > 0){ min = t[i]; } } return min; } public static void main(String[] args) { //Double[] demo = {1.9,3.9,0.4,9.9,10.0}; //Integer[] demo = {6,8,5,74,1}; String[] demo = {"33","qwe","qw1","dfds","we"}; System.out.println(min(demo)); } }
2 常用知识:
2.1 不同类型判断
List<StudentDto> list = (o1 instanceof List) ? (List)o1 : Collections.EMPTY_LIST; StudentDto dto = (o1 instanceof StudentDto) ? (StudentDto) o1 : new StudentDto(); String dto = (o1 instanceof String) ? (String) o1 : "";
详细demo参考我这篇博客:统一响应 - 菜鸟乙 - 博客园 (cnblogs.com)
N 概念简述
N.1 泛型是java哪个版本引入的
JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
N.2 为什么要引入泛型
在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。
对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身就是一个安全隐患。
那么泛型的好处就是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的。
N.3 泛型通配符具体代表的含义
本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ,我们可以换成 A-Z 之间的任何一个 字母都可以,并不会影响程序的正常运行,但是如果换成其他的字母代替 T ,在可读性上可能会弱一些。通常情况下,T,E,K,V,?是这样约定的:
-
?表示不确定的 java 类型
-
T (type) 表示具体的一个java类型
-
K V (key value) 分别代表java键值中的Key Value
-
E (element) 代表Element
N.4 文章参考
诸葛