瞎扯淡:Java 泛型编程 - 泛型方法

本贴最后更新于 2981 天前,其中的信息可能已经事过境迁

概论

泛型方法可以定义在泛型类中,也可以定义在非泛型的普通类中,即泛型方法不依赖于泛型类的存在而存在,而是可以单独定义和使用。有一个原则:能使用泛型方法完成的功能,就不要使用泛型类。泛型方法表达一种:deal with T 的概念。
泛型方法的一般格式:

public <T> void methodName(T t){ }

例如:

public class GenericMethodTest { public static <T> void dealWith( T t){ System.out.println(t.getClass().getName()); } public static void main(String[] args) { GenericMethodTest.dealWith("String"); GenericMethodTest.dealWith(new Object()); GenericMethodTest.dealWith(new BigDecimal(123)); } }

可变参数泛型方法

泛型方法和可变参数可以结合使用例如:

public class MultArgsTest { @SafeVarargs public static <T> List<T> makeList(T... args){ List<T> result = new ArrayList<T>(); for(T item : args){ result.add(item); } return result; } public static void main(String[] args) { List<String> listOfStr = MultArgsTest.makeList("one","two","three","four"); List<String> listOfStr2 = MultArgsTest.makeList("one","two","three","four","five","six"); System.out.println(listOfStr); System.out.println(listOfStr2); } }

具体实例

  • 可以利用 Java 的泛型特性,编写一些实用的代码,比如生成器,它与反射技术结合,可以用于批量生成对象(对象需要声明为 public,确保 BasicGenerator 类具有访问权限,同时必须具备默认的构造器[一般类都有]):
public class BasicGenerator<T> implements Generator<T> { private Class<T> type; public BasicGenerator(Class<T> type) { this.type = type; } public T next() { try { return type.newInstance(); } catch (Exception e) { throw new RuntimeException(e); } } public static <T> Generator<T> create(Class<T> type) { return new BasicGenerator<T>(type); } public static void main(String[] args) { // 其他类型也可以 String[] thousandStrs = new String[1000]; Generator<String> gen = BasicGenerator.create(String.class); for (int i = 0; i < 1000; i++) { thousandStrs[i] = gen.next(); } } } interface Generator<T> { public T next(); }
  • 除了批量生成类之外,还可以结合集合类的特性,编写具有广泛用途的代码,比如,下面这个代码结合了 Set 类,用来求得元素集合的交集并集等:
public class Sets { /** * 返回集合a与集合b的并集 * * @param a * @param b * @return */ public static <T> Set<T> union(Set<T> a, Set<T> b) { Set<T> result = new HashSet<T>(a); result.addAll(b); return result; } /** * 求集合a,b的交集并返回 * * @param a * @param b * @return */ public static <T> Set<T> intersection(Set<T> a, Set<T> b) { Set<T> result = new HashSet<T>(a); result.retainAll(b); return result; } /** * 移除superset中subse包含的元素并返回 * * @param superset * @param subset * @return */ public static <T> Set<T> difference(Set<T> superset, Set<T> subset) { Set<T> result = new HashSet<>(superset); result.removeAll(subset); return result; } /** * 返回a,b集合交集之外的元素 * * @param a * @param b * @return */ public static <T> Set<T> complement(Set<T> a, Set<T> b) { return difference(union(a, b), intersection(a, b)); } }

上述的代码可以结合任何实现了 Set 接口的类来进行上述的数学运算。不仅限于此,Java 的泛型方法能够大幅度的提高代码的通用性。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 1 关注
  • 泛型
    7 引用 • 7 回帖
  • 瞎扯淡
    4 引用 • 10 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    来看看,感觉不错[em02]

  • someone

    神不知鬼不觉的就来了哈[em01]