java泛型
来源:互联网 发布:最优化方法袁亚湘孙文 编辑:程序博客网 时间:2024/06/07 18:34
简述java泛型的11个知识点,文末有之前看到一篇通俗易懂的泛型讲解资料。
泛型Generics实现了参数化类型的概念,也就是支持多重类型。Java中泛型的实现事实上不是很广泛,甚至让人疑问这个特性是否符合“Generics”这个称谓。Java的泛型可能无法完全做到你期望的所有事情。但是不代表java的泛型是没用的。本文会讲解java中泛型的强大之处和限制,使得我们能更高效地使用该特性。
1、tuple:多元组
将一组对象包装到一个对象中。用于一些methods需要返回多个对象的时候。
当需要两个对象的tuple(final用于提高安全性):
public class TwoPurple<A, B> { public final A first; public final B second; public TwoPurple(A first, B second) { this.first = first; this.second = second; } public String toString() { return first+":"+second; }}
当你需要三个或者更多对象的tuple时,通过继承进行扩展。
public class ThreeTuple<A, B, C> extends TwoPurple<A, B>{ public final C three; public ThreeTuple(A first, B second, C three) { super(first, second); this.three = three; } public String toString() { return ""+first+":"+second+":"+three; }}
通过泛型,可以轻松创建任何types组的tuple用于返回。
2、泛型可以用于stack、list等数据结构,用于存储各种不同类型的数据。
3、泛型接口
public interface Generator<T> { T next();}
泛型接口与泛型类的用法很相似。
4、泛型方法
public <T> void genericMethod(T a) { System.out.println("Im a generic method"+a); }
泛型方法需要将泛型参数列表,放置于返回值前(如上图)
1. 泛型类需要在实例化时指定参数的类型
2. 泛型方法不需要指明,编译器会自动识别。
5、可变参数varargs和泛型方法
//单纯可变参数public static ArrayList makeList(int... args) { ArrayList list = new ArrayList(); for(int num:args) { list.add(num); } return list;}//可变参数和泛型完美配合public static <T> ArrayList<T> makeList(T... args) { ArrayList<T> list = new ArrayList<>(); for(T arg: args) { list.add(arg); } return list;}
这个makeList方法和 java.util.Arrays.asList( ) 的标准库方法功能室一样的。
6、泛型的应用
- 通用的generator 2.set
7、泛型的bounds
对泛型使用的参数类型进行了限制。
interface MyColor...class Colored<T extends MyColor> { ....}//有接口MyColor,T必须要继承自MyColorclass Dimension...//有接口Dimension,T的限制不能先inerface后class!class ColoredDimension<T extends HasColor & Dimension> {...}//下面先class后interface才是正确的class ColoredDimension<T extends Dimension & HasColor>{...}//-----------//如果类需要制定bound的泛型,此外还要继承superclass如下即可class Colored2<T extends HasColor> extends HoldItem<T>{...}
8、泛型方法的限制
泛型方法添加bound,需要在这个泛型列表中表示。如下:
public <T extends Number> T showKeyName(Generic<T> container){...}
9、泛型通配符
有一个泛型类Generic,比如Number是Integer的超类,有实参Generic obj1和Genericobj2,对于需要Generic参数的地方,却无法使用Generic,因为两者已经不是父子类关系。这是后将形参变成Generic<?> obj,就是能传入两者的。因为?可以是所有类型的超类。
10、静态方法与泛型
如果静态方法要使用泛型,则必须将静态方法变成泛型方法。
11、泛型数组
Java终不能创建一个确切的泛型类型的数组
List<String>[] ls = new ArrayList<String>[10]; × 不可以List<?>[] ls = new ArrayList<?>[10]; √ 可以List<String>[] ls = new ArrayList[10]; √ 可以
对于通配符的模式,从数组中取出的值需要进行类型转换。
List<?>[] lsa = new List<?>[10]; //通配符形式List<Integer> li = new ArrayList<Integer>(); li.add(new Integer(3)); Integer i = (Integer) lsa[1].get(0); // 进行类型转换后使用
12、Java泛型学习链接
http://blog.csdn.net/s10461/article/details/53941091
- 【java 2】java泛型
- Java 泛型 Java generic
- Java Tutorials_Generics(java泛型)
- Java基础 Java 泛型
- java 泛型
- java泛型
- Java泛型
- Java泛型
- java泛型
- java泛型
- java泛型
- Java 泛型
- Java泛型
- Java 泛型
- JAVA 泛型
- java 泛型
- java泛型
- Java泛型
- 常见的错误码
- C语言 可变参数
- 最近公共祖先LCA--Tarjan算法
- INSERT 语句与 FOREIGN KEY 约束"XXX"冲突。该冲突发生于数据库"XXX",表"XXX", column 'XXX。
- leetcode 395. Longest Substring with At Least K Repeating Characters 最长K个数量的字符 + DFS深度优先搜索
- java泛型
- Leetcode解题笔记 64. Minimum Path Sum [Medium] 动态规划
- 神经网络浅讲:从神经元到深度学习
- Android show memory info cmd
- 深度学习发展简要笔记
- C++编程之SOUI库listview学习(加入单选按钮)
- dasasddgsfdiji
- Oracle 数据库的 dml 误操作使用闪回解决
- C++17 标准正式发布:开发者可更简单地编写和维护代码