java泛型的一些常见用法
来源:互联网 发布:苏州软件测试 编辑:程序博客网 时间:2024/05/19 13:28
本文主要参考下面几篇文章:
http://blog.csdn.net/seu_calvin/article/details/52230032
http://blog.csdn.net/orzlzro/article/details/7017435
http://sharewind.iteye.com/blog/1622164
https://www.zhihu.com/question/20400700
1、 泛型类(接口)的写法以及继承
// 类似java.util.function.Functionpublic interface GenericInterface<T, R> { public R apply(T t);}// 类似java.util.stream.IntStreampublic interface InheritGeneric0 extends GenericInterface<String, Integer> {}// 类似java.util.function.UnaryOperatorpublic interface InheritGeneric1<T> extends GenericInterface<T, T> {}// 类似java.util.HashMappublic interface InheritGeneric2<T, R> extends GenericInterface<T, R> {}// JDK库尚未找到类似的public interface InheritGeneric3<V, T, R> extends GenericInterface<T, R> { public V apply2(T t, R r);}
2、泛型方法的写法
public class Retryer<T> { private T value; private int id = 0; public Retryer() { } public Retryer(int id) { this.id = id; } public T getValue() { return value; } public void setValue(T value) { this.value = value; } public int getId() { return id; } public void setId(int id) { this.id = id; }}// 泛型的声明:方法的修饰符(public,static,final,abstract等)之后, 返回值(void,int等)之前public class SpecificClass { // 入参泛型,返回值非泛型 public <L, R> int sum(L[] left, R[] right) { return left.length + right.length; } // 入参非泛型,返回值泛型 public static <T> Retryer<T> build() { return new Retryer<T>(); } // 入参泛型,返回值泛型 public <L, R, V> Retryer<V> buildLength(L[] left, R[] right) { return new Retryer<V>(left.length + right.length); } // 限制泛型: 只能是某个类的子类或者只能是实现了某些接口的类 // <T extends Comparable> // <T extends Number&Serializable> // <T extends Comparable&Serializable> public <L extends Number, R extends Number> double add(L left, R right) { return left.doubleValue() + right.doubleValue(); }}
3、泛型的一些基本特性:不能实例化对象和数组
import java.lang.reflect.Array;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;public class GenericBasicFeature { public static void main(String[] args) { test1(); String[] stringArray = (String[]) Array.newInstance(String.class, 5); System.out.println("stringArray.length=" + stringArray.length); String[] stringArray2 = GenericBasicFeature.test2(5, String.class); System.out.println("stringArray2.length=" + stringArray2.length); } // 泛型只在编译期有效 // http://blog.csdn.net/seu_calvin/article/details/52230032 public static void test1() { List<String> stringList = new ArrayList<String>(); stringList.add("aaa"); // 编译报错 // stringList.add(new Object()); // 运行时通过反射添加元素 try { Class clazz = stringList.getClass(); Method method = clazz.getMethod("add", Object.class); method.invoke(stringList, 100); } catch (Exception e) { e.printStackTrace(); } // [aaa, 100] System.out.println(stringList); } // java不支持创建泛型数组 // http://blog.csdn.net/orzlzro/article/details/7017435 public static <T> T[] test2(int length, Class<T> newType) { // T t = new T(); 编译错误 // T[] wrong = new T[length]; 编译错误 // T[] newArray = (T[]) new Object[length]; 运行时ClassCastException // 参考Arrays.copyOf T[] newArray = (T[]) Array.newInstance(newType, length); return newArray; }}
4、泛型的super和extend的PECS原则
// PECS(Producer Extends Consumer Super)public class Demo { static class Food { } static class Fruit extends Food { } static class Apple extends Fruit { } public void testExtend() { List<? extends Food> flist = new ArrayList<Food>(); flist.add(new Apple()); //compile error flist.add(new Fruit()); //compile error flist.add(new Object()); //compile error Food fruit = flist.get(0); //ok } public void testSuper() { List<? super Food> flist = new ArrayList<Food>(); flist.add(new Food()); //ok flist.add(new Fruit()); //ok flist.add(new Apple()); //ok Food f = flist.get(0);// compile error }}
public class ExtendsContainer<T> { private T data; public ExtendsContainer(T data) { this.data = data; } public T getData() { return data; } public void setData(T data) { this.data = data; }}public class Demo { static class Food { } static class Fruit extends Food { } static class Apple extends Fruit { } public static void main(String[] args) { ExtendsContainer<Food> food = new ExtendsContainer<Food>(new Food()); ExtendsContainer<Fruit> fruit = new ExtendsContainer<Fruit>(new Fruit()); ExtendsContainer<Apple> apple = new ExtendsContainer<Apple>(new Apple()); ExtendsContainer<String> string = new ExtendsContainer<String>("abc"); getDataNoLimit(food); getDataNoLimit(fruit); getDataNoLimit(apple); getDataNoLimit(string); getDataOnlyFood(food); getDataOnlyFood(fruit); getDataOnlyFood(apple); getDataOnlyFood(string); getDataAnyFood(food); getDataAnyFood(fruit); getDataAnyFood(apple); getDataAnyFood(string); } public static void getDataNoLimit(ExtendsContainer<?> container) { System.out.println("data:" + container.getData()); } public static void getDataOnlyFood(ExtendsContainer<Food> container) { System.out.println("data:" + container.getData()); } public static void getDataAnyFood(ExtendsContainer<? extends Food> data) { System.out.println("data :" + data.getData()); }}
0 0
- java泛型的一些常见用法
- Java 8的一些常见用法
- JAVA基础——JSONObject 的一些常见用法
- 一些常见函数的用法
- netstat的一些常见用法
- 日期的一些常见用法
- TCPDUMP的一些常见用法
- fastjson的一些常见用法
- python的一些常见用法
- swift的一些常见用法
- vim的一些常见用法
- recycleView的一些常见用法
- axios的一些常见用法
- java中的泛型的一些常见例子
- java中的泛型的一些常见例子
- java中的泛型的一些常见例子
- ViewStub的一些不常见的用法
- #define的一些不常见的用法
- Firewalld (redhat7)
- 浮动布局所带来的影响以及如何清除浮动
- chroot exec
- Apache Beam Java SDK 快速开始
- POJ 3301 Texas Trip 已被翻译
- java泛型的一些常见用法
- gym-101138D(后缀和,莫队算法,容斥原理,好题)
- SublimeText 注册码 & 常用插件
- 八大排序算法详解——冒泡排序
- 并查集
- 蓝桥杯 算法提高 快速幂 快速幂longlong 下最稳的姿势
- 聚类算法 dbscan java 实现
- PAT甲级1057
- C语言中数据库的基本操作