`
不平凡的人
  • 浏览: 35440 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

泛型(一)

 
阅读更多

泛型是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);
		}
	}

}

 

如上:未完待续......

 

 

 

  • 大小: 10.4 KB
分享到:
评论

相关推荐

    C#泛型类、泛型方法、泛型接口、泛型委托的实例

    在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...

    泛型dao 泛型dao 泛型dao

    泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名...

    java 一个关于泛型的简单例子

    泛型是Java编程语言中的一个重要特性,它引入于JDK 5.0,极大地提高了代码的类型安全性和可读性。泛型允许我们在类、接口和方法中使用类型参数,这样我们可以在编译时检查类型,避免了运行时类型转换的麻烦和潜在的...

    JAVA-泛型课件-泛型课件

    泛型是Java语言的一个重要特性,首次出现在Java SE 1.5版本中。它的引入主要是为了解决在集合操作中类型安全性的问题,并通过引入参数化类型的概念,提高了代码的复用性与可读性。 ### 泛型概念 泛型,即参数化...

    C#泛型,非泛型实现枚举

    泛型提供了一种方式,使得代码可以处理多种数据类型,而无需为每种类型重复编写相同逻辑。枚举则是用于定义一组预定义的常量,便于表示一组相关的值。下面我们将详细探讨如何在C#中使用泛型实现枚举功能,以及非泛型...

    泛型java的泛型知识,非常有用

    Java 泛型是一种强大的语言特性,自JDK 5.0引入以来,极大地提升了代码的类型安全性以及重用性。泛型允许我们在类、接口和方法中使用类型参数,这样在编译时期就能检查类型匹配,减少运行时类型转换异常。 1. **...

    c#泛型类、泛型方法、泛型接口、泛型委托

    在C#编程语言中,泛型是一个强大的特性,它允许我们编写可重用的代码,同时保持类型安全和性能。泛型主要分为四个关键部分:泛型类、泛型方法、泛型接口和泛型委托。下面将详细介绍这四个方面。 1. 泛型类: 泛型类...

    java泛型指南 经典

    Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 Java 泛型的基本概念、使用方法以及高级技巧。 #### ...

    泛型笔记学习2009

    以下是一个使用泛型的例子,展示了如何创建一个泛型类和泛型方法: ```java // 泛型类示例 public class Box&lt;T&gt; { private T t; public void set(T t) { this.t = t; } public T get() { return t; } } //...

    关于java基础的泛型的练习

    Java泛型是Java SE 5.0引入的一个重要特性,它极大地增强了代码的类型安全性和可读性。泛型在编程中的应用广泛,特别是在集合框架中,使得我们可以在编译时就检查类型,避免了不必要的类型转换,并且提高了代码的...

    VC++ 2005:泛型编程

    泛型编程是C++/CLI中的一种重要特性,允许程序员创建可重用的代码,这些代码能够处理多种数据类型,而无需每次都复制和修改代码。泛型编程的核心思想是参数化类型,即将数据类型作为一个参数传递给代码,使得代码...

    c# 泛型的使用,教你如何用泛型

    在C#编程语言中,泛型是一种强大的特性,它允许我们编写可重用的代码,同时保持类型安全和性能。泛型是C# 2.0版本引入的新特性,极大地提高了代码的灵活性和效率。本篇文章将深入探讨C#中的泛型使用方法,帮助你更好...

    利用反射生成泛型类对象

    反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool&lt;Point&gt; pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...

    gson解析泛型和将泛型转为json字符串

    当我们需要从JSON字符串反序列化到泛型类型时,可以创建一个泛型类型的`Gson`对象或使用`fromJson()`方法。例如,如果你有一个泛型列表`List&lt;T&gt;`,你可以这样做: ```java Type listType = new TypeToken...

    Generic_2(泛型类-泛型方法-泛型接口-泛型限定(上限)

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...

    泛型和泛型集合类用法

    #### 一、泛型基础概念 泛型是现代编程语言中的一项重要特性,它允许开发者在不指定具体数据类型的情况下编写类或方法,从而达到代码重用的目的。在.NET Framework 2.0及以后版本中,泛型得到了广泛的应用和支持。...

    泛型封装.rar

    在C#编程中,泛型是一种强大的特性,它允许我们创建可重用的类型安全的代码,能够处理多种数据类型。"泛型封装.rar"这个压缩包文件很可能包含了一个示例,展示了如何在C#中有效地使用泛型进行类或方法的封装。"MVC...

    C#泛型实例Demo

    C#泛型是一种强大的编程工具,它允许在不指定具体数据类型的情况下定义类、接口和方法。这使得代码更具灵活性,同时保持了编译时类型安全性和运行时的高效性。在C#中,泛型主要体现在以下几个方面:泛型类、泛型接口...

Global site tag (gtag.js) - Google Analytics