知乎专栏 |
java 中泛型标记符:
E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定的 java 类型 S 和 U 基本上与 T 相同,即表示任意的一个Java类型。
其实我们可以使用 A-Z 之间的任何一个 字母,并不会影响程序的正常运行,但是如果换成 T,E,K,V,?,S,U 字母,在可读性上更好一些。
package cn.netkiller.test; import java.util.List; public class Test { public <T> String method(String name, T t) { System.out.println("普通泛型参数 : " + t + " 数据类型: " + t.getClass().getName()); String str = name + ": " + t; return str; } public static void main(String[] args) { Test test = new Test(); System.out.println(test.method("001", "bb")); System.out.println(test.method("002", true)); System.out.println(test.method("003", 100)); System.out.println(test.method("003", 100L)); System.out.println(test.method("003", 100.00)); System.out.println(test.method("003", 'c')); System.out.println(test.method("003", List.of("Neo"))); } }
通泛型参数 : bb 数据类型: java.lang.String 001: bb 普通泛型参数 : true 数据类型: java.lang.Boolean 002: true 普通泛型参数 : 100 数据类型: java.lang.Integer 003: 100 普通泛型参数 : 100 数据类型: java.lang.Long 003: 100 普通泛型参数 : 100.0 数据类型: java.lang.Double 003: 100.0 普通泛型参数 : c 数据类型: java.lang.Character 003: c 普通泛型参数 : [Neo] 数据类型: java.util.ImmutableCollections$List12 003: [Neo]
下面的例子演示了如何使用泛型方法打印不同类型的数组元素:
package cn.netkiller.test; public class GenericsTest { // 泛型方法 printArray public static <E> void printArray(E[] inputArray) { // 输出数组元素 for (E element : inputArray) { System.out.printf("%s ", element); } System.out.println(); } public static void main(String[] args) { System.out.println(Thread.currentThread()); // 创建不同类型数组: Integer, Double 和 Character, String Integer[] intArray = {1, 2, 3, 4, 5}; Double[] doubleArray = {1.1, 2.2, 3.3, 4.4}; Character[] charArray = {'H', 'E', 'L', 'L', 'O'}; String[] stringArray = {"Neo", "Chen"}; System.out.println("整型数组元素为:"); printArray(intArray); // 传递一个整型数组 System.out.println("\n双精度型数组元素为:"); printArray(doubleArray); // 传递一个双精度型数组 System.out.println("\n字符型数组元素为:"); printArray(charArray); // 传递一个字符型数组 System.out.println("\n字符串数组元素为:"); printArray(stringArray); // 传递一个字符型数组 } }
package cn.netkiller.test; import java.util.List; public class Test { public static <T, E> String staticMethod(T t, E e) { String str = "静态泛型方法 参数:" + t + ", " + e + " 数据类型:" + e.getClass().getName(); return str; } public static void main(String[] args) { System.out.println(Test.staticMethod("001", "bb")); System.out.println(Test.staticMethod("002", true)); System.out.println(Test.staticMethod("003", 100)); System.out.println(Test.staticMethod("003", 100L)); System.out.println(Test.staticMethod("003", 100.00)); System.out.println(Test.staticMethod("003", 'c')); System.out.println(Test.staticMethod("003", List.of("Neo"))); } }
package cn.netkiller.test; import java.util.List; public class Test { public <A> void argsMethod(A... args) { for (A arg : args) { System.out.print(arg); System.out.print(" - "); } System.out.println(); } public static void main(String[] args) { Test test = new Test(); System.out.println("静态泛型方法"); test.argsMethod("aaa", "bbb", "ccc"); test.argsMethod(1, 2, 3); test.argsMethod(true, false, true); test.argsMethod(73.5, 100.00, 88.8); test.argsMethod('a', 'b', 'c'); test.argsMethod(1L, 3L, 5L); } }
package cn.netkiller.test; import java.util.Arrays; import java.util.List; import java.util.Map; public class Test { public <T> T method(T t) { System.out.println("类型:" + t.getClass().getName() + " 返回值:" + t); return t; } public static void main(String[] args) { Test test = new Test(); System.out.println("返回泛型方法"); String s = test.method("aaa"); System.out.println(s); int n = test.method(13579); System.out.println(n); boolean b = test.method(false); System.out.println(b); List<String> l = test.method(Arrays.asList("neo", "chen", "netkiller")); System.out.println(l); Object m = test.method(Map.of("name", "neo", "nickname", "netkiller")); System.out.println(m); } }
返回泛型方法 类型:java.lang.String 返回值:aaa aaa 类型:java.lang.Integer 返回值:13579 13579 类型:java.lang.Boolean 返回值:false false 类型:java.util.Arrays$ArrayList 返回值:[neo, chen, netkiller] [neo, chen, netkiller] 类型:java.util.ImmutableCollections$MapN 返回值:{nickname=netkiller, name=neo} {nickname=netkiller, name=neo}
public class Generics<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; } public static void main(String[] args) { Generics<Integer> integerGenerics = new Generics<Integer>(); Generics<String> stringGenerics = new Generics<String>(); integerGenerics.add(new Integer(10)); stringGenerics.add(new String("Netkiller")); System.out.printf("整型值为 :%d\n\n", integerGenerics.get()); System.out.printf("字符串为 :%s\n", stringGenerics.get()); } }