泛型是JDK5时的技术,主要作用于编译时期,是编译时期的安全技术。
一、元组
1、引入:仅一次方法调用就能返回多个对象,编码中应该会使用到该功能。但是对于一个方法的return来说,一次只能返回一个对象。因此,解决办法就是创建一个对象,让其持有想要返回的多个对象。每次需要该种场景的情况时,我们就创建一个类来完成工作。
2、元组:将一组对象直接打包存储于一个单一的对象中。可以理解为元组为一个容器对象,该容器对象只允许读取其中的元素,不允许向其中存放新的元素。因此,该对象的成员声明时用final修饰。
3、示例如下:
package net.oschina.tkj.chapter15.tuple; /** * 元组类 * * @author Freedom * * @param <A> * @param <B> */ public class TwoTuple<A, B> { private final A a; public final B b; public TwoTuple(A a, B b) { this.a = a; this.b = b; } public A getA() { return a; } public B getB() { return b; } @Override public String toString() { return "TwoTuple [a=" + a + ", b=" + b + "]"; } public static void main(String[] args) { Red red = new Red(); red.setAge(11); red.setName("红色方"); VmInfo vm = new VmInfo(); vm.setVmId(1); vm.setVmName("POPDAS"); vm.setVmNum(2); // 二元元组 TwoTuple<Red, VmInfo> two = new TwoTuple<Red, VmInfo>(red, vm); System.out.println("元组对象:"+two); // 获取元组中的成员 VmInfo tupleRed = two.getB(); Red redTuple = two.getA(); System.out.println("tupleRed:" + tupleRed); System.out.println("redTuple:" + redTuple); } }
二、泛型类模拟一个简单堆栈
1、代码示例
package net.oschina.tkj.chapter15.stack; /** * 泛型类,简单的堆栈 * * @author Freedom * */ public class SimpleStack<T> { /* * 内部类用于提供数据 */ private static class Node<K> { K item; Node<K> next; // 创建外部类对象时,同时创建一个内部类型对象,该对象为末端哨兵 Node() { this.item = null; this.next = null; } Node(K item, Node<K> next) { this.item = item; this.next = next; } boolean end() { return item == null && next == null; } } // 创建外部类对象时,初始化一个内部类对象,充当末端哨兵 private Node<T> bottom = new Node<T>(); // 添加元素 public void push(T item) { bottom = new Node<T>(item, bottom); } // 取出元素 public T pop() { T res = bottom.item; if (!bottom.end()) { bottom = bottom.next; } return res; } public static void main(String[] args) { SimpleStack<String> simple = new SimpleStack<String>(); String str = "this is a luck dog"; for (String s : str.split(" ")) { simple.push(s); } String s; while ((s = simple.pop()) != null) { System.out.print(s+" "); } } }
示例中使用了末端哨兵的功能,来判断堆栈何时为空。
三、泛型方法
1、类中可以包含参数化的方法,而该方法所在的类可以是泛型类,也可以不是泛型类。简言之,泛型方法与泛型类没有必然关系。
2、泛型方法使用原则:
①使用泛型方法可以取代整个类的泛型化,则优先使用泛型方法;
②对static方法而言,无法访问泛型类的类型参数(报错信息:Cannot make a static reference to the non-static type T);如果static方法需要使用泛型能力,必须要在自己的方法上声明泛型(原因:因为类上声明的参数化类型,需要创建的对象的时具体制定,对于static方法而言,可以不用创建对象直接调用,此时不能知道参数化的具体类型,因此编译不通过;通过方法声明时,在调用方法时可以确定具体的泛型的类型)
错误示例:
package net.oschina.tkj.chapter15.method; public class GenerateMethods<T> { /* * 该方法会报错:Cannot make a static reference to the non-static type T * static方法无法访问泛型类的类型参数 */ public static void f(T t) { } /* * 该方法正确,是static方法具备泛型能力,必须在自己的方法上声明泛型 */ public static <K> void f1(K k) { } }
泛型方法示例:
package net.oschina.tkj.chapter15.method; import java.util.ArrayList; import java.util.List; import net.oschina.tkj.chapter15.tuple.TwoTuple; import net.oschina.tkj.chapter15.tupleclass.Red; import net.oschina.tkj.chapter15.tupleclass.VnfInfo; public class GenerateMethods<T> { /* * 非static方法可以直接使用,泛型类声明的泛型类型 */ public void g(T t) { } /* * 如下static方法需在自己方法上声明泛型类型 */ public static <T> void f(T t) { System.out.println(t.getClass().getSimpleName()); } public static <K, V> TwoTuple<K, V> f1(K k, V v) { return new TwoTuple<K, V>(k, v); } public static <T> List<T> f2(T... args) { List<T> list = new ArrayList<T>(); for (T t : args) { list.add(t); } return list; } public static void main(String[] args) { // 泛型方法 f(new Red()); TwoTuple<Red, VnfInfo> method = f1(new Red(), new VnfInfo()); System.out.println("method:" + method); f2("a", "b", "c"); f2(new String[] { "c", "d", "e" }); f2(new ArrayList<String>()); List<Object> list = f2(new Red(), new VnfInfo()); for (Object o : list) { System.out.println(o); } } }
如上:未完待续......
相关推荐
在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...
泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名...
泛型是Java编程语言中的一个重要特性,它引入于JDK 5.0,极大地提高了代码的类型安全性和可读性。泛型允许我们在类、接口和方法中使用类型参数,这样我们可以在编译时检查类型,避免了运行时类型转换的麻烦和潜在的...
泛型是Java语言的一个重要特性,首次出现在Java SE 1.5版本中。它的引入主要是为了解决在集合操作中类型安全性的问题,并通过引入参数化类型的概念,提高了代码的复用性与可读性。 ### 泛型概念 泛型,即参数化...
泛型提供了一种方式,使得代码可以处理多种数据类型,而无需为每种类型重复编写相同逻辑。枚举则是用于定义一组预定义的常量,便于表示一组相关的值。下面我们将详细探讨如何在C#中使用泛型实现枚举功能,以及非泛型...
Java 泛型是一种强大的语言特性,自JDK 5.0引入以来,极大地提升了代码的类型安全性以及重用性。泛型允许我们在类、接口和方法中使用类型参数,这样在编译时期就能检查类型匹配,减少运行时类型转换异常。 1. **...
在C#编程语言中,泛型是一个强大的特性,它允许我们编写可重用的代码,同时保持类型安全和性能。泛型主要分为四个关键部分:泛型类、泛型方法、泛型接口和泛型委托。下面将详细介绍这四个方面。 1. 泛型类: 泛型类...
Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 Java 泛型的基本概念、使用方法以及高级技巧。 #### ...
以下是一个使用泛型的例子,展示了如何创建一个泛型类和泛型方法: ```java // 泛型类示例 public class Box<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } } //...
Java泛型是Java SE 5.0引入的一个重要特性,它极大地增强了代码的类型安全性和可读性。泛型在编程中的应用广泛,特别是在集合框架中,使得我们可以在编译时就检查类型,避免了不必要的类型转换,并且提高了代码的...
泛型编程是C++/CLI中的一种重要特性,允许程序员创建可重用的代码,这些代码能够处理多种数据类型,而无需每次都复制和修改代码。泛型编程的核心思想是参数化类型,即将数据类型作为一个参数传递给代码,使得代码...
在C#编程语言中,泛型是一种强大的特性,它允许我们编写可重用的代码,同时保持类型安全和性能。泛型是C# 2.0版本引入的新特性,极大地提高了代码的灵活性和效率。本篇文章将深入探讨C#中的泛型使用方法,帮助你更好...
反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...
当我们需要从JSON字符串反序列化到泛型类型时,可以创建一个泛型类型的`Gson`对象或使用`fromJson()`方法。例如,如果你有一个泛型列表`List<T>`,你可以这样做: ```java Type listType = new TypeToken...
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
#### 一、泛型基础概念 泛型是现代编程语言中的一项重要特性,它允许开发者在不指定具体数据类型的情况下编写类或方法,从而达到代码重用的目的。在.NET Framework 2.0及以后版本中,泛型得到了广泛的应用和支持。...
在C#编程中,泛型是一种强大的特性,它允许我们创建可重用的类型安全的代码,能够处理多种数据类型。"泛型封装.rar"这个压缩包文件很可能包含了一个示例,展示了如何在C#中有效地使用泛型进行类或方法的封装。"MVC...
C#泛型是一种强大的编程工具,它允许在不指定具体数据类型的情况下定义类、接口和方法。这使得代码更具灵活性,同时保持了编译时类型安全性和运行时的高效性。在C#中,泛型主要体现在以下几个方面:泛型类、泛型接口...