`

java泛型--概念、使用、自定义……

 
阅读更多

0,泛型不能有用于static的。

 

1,Class

Class<Boolean> clazz  等效于 Boolean.class;

Class<T> valueType 等效于 T.class

public void _testGeneric(Class<?>clazz)

等效于

public <B> void _testGeneric(Class<? extends B>clazz){

 

2,通配符

?只能用于方法泛型,不能用于类泛型。

 

3,泛型就是不确定类型

//泛型如果为确定类型时,就没必要存在了,就想这个警告:
//The type parameter Plant is hiding the type Plant
public class Test2<Plant> {
	private Plant t;
	public Plant get(){
		return t;
	}
}

 

 4,把子类使用的其他具体类型传给父类,让父类统一处理。

例子:class Apple extends Fruit extends Plant implements Living

public class PlantFSM<T extends Plant> {
	private T owner;
	public PlantFSM(){}
	public PlantFSM(T owner){
		this.owner = owner;
	}
	public T getOwner() {
		return owner;
	}
	public void setOwner(T owner) {
		this.owner = owner;
	}
}

 

public class AppleFSM extends PlantFSM<Apple> {
	public AppleFSM(){}
	public AppleFSM(Apple owner) {
		super(owner);
	}
	public static void main(String[] args) {
		AppleFSM appleFSM = new AppleFSM();
		Apple apple = new Apple();
//		自动为Apple类型:com.generic.PlantFSM.setOwner(Apple owner)
		appleFSM.setOwner(apple);
//		自动为Apple类型:Apple com.generic.PlantFSM.getOwner()
		appleFSM.getOwner();
	}
	//方法定义的泛型F
	public <F> F getF(){
		return null;
	}
}

 反编译后

public class PlantFSM{
    public PlantFSM(){}
    public PlantFSM(Plant owner){
        this.owner = owner;
    }
    public Plant getOwner(){
        return owner;
    }
    public void setOwner(Plant owner){
        this.owner = owner;
    }
    private Plant owner;
}

 

public class AppleFSM extends PlantFSM{
    public AppleFSM(){}
    public AppleFSM(Apple owner){
        super(owner);
    }
    public static void main(String args[]){
        AppleFSM appleFSM = new AppleFSM();
        Apple apple = new Apple();
        appleFSM.setOwner(apple);
        appleFSM.getOwner();
    }
    public Object getF(){
        return null;
    }
}

 

5,

例子2

public interface IProcessor {
	public String process(String idipPacket);
	public int getReqCmdId();
	public int getRespCmdId();
}

 

/**
 * <"B">与<"BODY">没任何区别,只是一个类型定义(占位符)。
 * @author naijiang.wang
 */
public abstract class AbstractProcessor<BODY> implements IProcessor{
	@Override
	public String process(String json) {
		DataPacket<BODY> dataPacket = getDataPacket(json);
		response = response(dataPacket, serverId);
		Object response = null; 
		try {
			dataPacket = getDataPacket(json);
			response = response(dataPacket, serverId);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(response == null) {
				response = responseForResult(dataPacket.getHead(), ResultType.API_ERROR);
			}
			resp = JsonUtils.toJson(response);
		}
		return resp ;
	}
	//返回的泛型范围,可以大于真实具体的类型返回。比如:DataPacket.body是QueryReq类型。
	private DataPacket<BODY> getDataPacket(String json) {
		return JsonUtils.toBean(json, DataPacket.class, getRequestBodyClass());
	}
	public abstract Class<BODY> getRequestBodyClass();
	private DataPacket<?> response(DataPacket<BODY> dataPacket, Integer serverId) {
		DataPacket<?> response = process(dataPacket.getHead(), dataPacket.getBody(), serverId);
		return response;
	}
	//子类方法中body比如是:QueryReq类型。<?>表示不是BODY泛型
	public abstract DataPacket<?> process(DataHeader head, BODY body, Integer serverId);
}

 

public class QueryProcessor extends AbstractProcessor<QueryReq>{
	@Override
	public Class<QueryReq> getRequestBodyClass() {
		return QueryReq.class;
	}
	@Override
	public DataPacket<?> process(DataHeader head, QueryReq body, Integer serverId) {
		QueryResp queryResp = new QueryResp();
		//填充数据
		return new DataPacket<QueryResp>(head, queryResp);
	}
}

 

http://www.infoq.com/cn/articles/cf-java-generics

分享到:
评论

相关推荐

    全面总结Java泛型--实例

    标题与描述均提到了“全面总结Java泛型--实例”,这表明文章旨在深入解析Java泛型的概念,并通过具体示例来展示其应用。Java泛型是Java编程语言的一个强大特性,它允许在编译时检查类型安全,并且所有的强制转换都是...

    java-泛型-面试题.docx

    java-泛型-面试题.docx

    Java 第二阶段提升编程能力【泛型】---- 代码

    Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...

    29-API-集合框架-泛型-使用_java_

    Java 泛型是Java编程语言中的一个重要特性,它在2004年随着...这个视频教程"29-API-集合框架-泛型-使用"应该会深入浅出地讲解这些概念,对于想要提升Java编程技能的初学者或有经验的开发者来说,都是很好的学习资源。

    JAVA-泛型课件-泛型课件

    泛型为Java编程带来了类型安全和代码重用的优势,通过参数化类型的概念,允许开发者编写更通用、更健壮的代码。它减少了类型转换错误,并通过编译时的类型检查避免了运行时的异常。泛型的引入使Java集合框架的使用...

    很好的Java泛型的总结

    Java泛型机制详解 Java泛型是Java语言中的一种机制,用于在编译期检查类型安全。Java泛型的出现解决了Java早期版本中类型安全检查的缺陷。Java泛型的好处是可以在编译期检查类型安全,避免了运行时的...

    java中的泛型-详细

    Java 泛型是JDK 1.5引入的一项重要特性,极大地增强了代码的类型安全性和重用性。泛型允许我们在编程时指定容器(如集合)所存储的对象类型,从而在编译时期就能捕获类型错误,避免了运行时的ClassCastException。 ...

    Java泛型的用法及T.class的获取过程解析

    Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...

    java 泛型方法使用示例

    下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...

    Java泛型应用实例

    例如,Java 8引入的流(Stream)API大量使用了泛型,使我们能够进行更高效、更简洁的集合操作。 配合博主的博客文章,你可以更深入地了解泛型在实际项目中的应用,包括但不限于类型安全的容器、泛型与反射的交互、...

    java泛型技术之发展

    本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展历程** - **早期版本的局限**:在Java泛型出现之前,程序员通常使用Object作为容器类(如ArrayList、HashMap等)的默认类型...

    JAVA泛型加减乘除

    这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

    Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

    Java 泛型详解 Java 泛型是 Java SE 5.0 中引入的一项特征,它允许程序员在编译时检查类型安全,从而减少了 runtime 错误...通过了解 Java 泛型的基本概念和关键字,我们可以更好地使用泛型来提高代码的质量和可读性。

    关于java基础的泛型的练习

    下面将详细解释Java泛型的基本概念、使用方式以及相关的知识点。 1. 泛型的基本概念: - 泛型是一种参数化类型,允许在定义类、接口和方法时使用类型参数,从而创建一种可以适用于多种类型的通用代码。 - 泛型的...

    Java泛型使用详细分析.pdf

    Java 泛型使用详细分析 Java 泛型是 Java 语言中的一种类型系统特性,允许开发者在编译期检查类型安全,以避免在运行时出现类型相关的错误。在本文中,我们将详细介绍 Java 泛型的使用方法和实现原理。 一、泛型的...

    java泛型学习ppt

    "Java 泛型学习" Java 泛型是 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的...

Global site tag (gtag.js) - Google Analytics