`
javawebsoa
  • 浏览: 409264 次
社区版块
存档分类
最新评论

Java学习笔记(泛型)

 
阅读更多

泛型是一种代码级的有效复用手段,理解泛型的机制有利于更好的编写程序.

1) 泛型类
package generictest;

public class MyA {

public MyA()
{

}
public String Name;
public String ReturnName()
{
return Name+"hello";
}
}
package generictest;

public class MyB extends MyA implements MyInterface {
public MyB()
{

}

@Override
public String getXXXXName() {
// TODO Auto-generated method stub
return "From interface:"+this.Name;
}
}
package generictest;

public interface MyInterface {
public String getXXXXName();
}
package generictest;

import java.util.LinkedList;
import java.util.List;
import java.lang.reflect.*;
import java.lang.*;

public class MyGeneric<T extends MyA & MyInterface>
{
public LinkedList<T> objs = new LinkedList<T>();
public void AddT(T obj)
{
objs.add(obj);
}
//如果需要实例化参数类型,需要传递类类型参数.
public void AddT(String Name,Class<T> c) throws InstantiationException, IllegalAccessException
{
T obj=null;
//无法转换,编译通过,但会有错误
//Class<T> theC = (Class<T>) obj.getClass();
//T theO2 = theC.newInstance();
T theO2 = c.newInstance();
theO2.Name = Name;
System.out.println(theO2.getXXXXName());
AddT(theO2);
//
System.out.println(theO2.ReturnName());
}

}


2) 泛型方法及测试

package generictest;

import java.util.LinkedList;

public class GenericTest {
	public static  void main(String args[])
	{
		MyGeneric<MyB> theGeneric = new MyGeneric<MyB>();
		try {
			theGeneric.AddT("ABC1",MyB.class);
			theGeneric.AddT("ABC2",MyB.class);
			theGeneric.AddT("ABC3",MyB.class);
			LinkedList<MyB> theObjs = theGeneric.objs;
			for(MyB theB : theObjs)
			{
				System.out.println(theB.Name);
			}
			
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//下面语句有错,因为MyA不符合约束
		//MyGeneric<MyA> theGeneric2 = new MyGeneric<MyA>();
		
		System.out.println("");
	}
	//泛型方法
	public static <U extends MyA> U BuildInstance(Class<U> C)
	{
		try {
			return C.newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

}



总结:
1) 泛型的约束不是必须的,但如果有类约束,类约束只能有一个,而且必须放在约束的第1位;
2)如果需要对泛型实例化,需要使用Class<T>参数明确传递到需要实例化的地方,而不能像后面语句那样直接实例化:T theT=new T();
这点上C#比较方便,只要泛型类型加上new()约束即可像实例化一般类那样对泛型类型实例化.T theT = new T();
3)<U<T>> 不合法,即泛型类型不能作为泛型类型;(在C#中是允许的)
4) 不能创建泛型数组(在C# 中是允许的)
MyGeneric<U>[] theA = new MyGeneric<U>[5];//是错误的写法.
5)泛型类型不能是基本类型,必须是类类型(继承于Object)(在C# 中是允许的)
MyGeneric<int> theA = new MyGeneric<int>();//是错误的写法.
6)泛类型并不能用instanceof测试来判断类型(在C# 中是允许的)
7)泛型类型不能用于异常捕获和异常抛出,也即如果泛型是异常类Exception的子类,并不能进行捕获和抛出.(在C# 中是允许的)
8)泛型类型不能出现在静态方法中.(在C# 中是允许的)
public class Singleton<T>
{
public static T getSingleInstance() // 错误
{
if (singleInstance == null) construct new instance of T
return singleInstance;
}
private static T singleInstance; //错误
}

9)泛型类型允许继承,但必须满足约束条件强化,即子类的约束条件不能弱于父类的约束条件.
public class MyGeneric2<T extends MyA & MyInterface & Runnable> extends MyGeneric<T> {
} 是合法的,但public class MyGeneric2<T extends MyA> extends MyGeneric<T> {
}是不合法的.
10) 如果B是A的子类,但MyGeneric2<B>和MyGeneric2<A>并无继承关系,是完全不同的两种类型.
11)泛型中使用通配符跟使用一般类型还是有区别的.(这种方式在C#中没有,也没必要)

Java的泛型机制和C#的泛型机制还是不一样的,C#的泛型机制更多的是模板作用,而Java的泛型采用的是底层替换的方式,本质上底层的泛型类型中的类型还是被替换成了Object,

只是帮你在做Cast而已.在运行时泛型类的类实例只有一份,而C# 中会根据不同的类型参数来实例化类实例,下面的测试可以证明:

public class GenericTest1<T> {

	public static int Count=0;//无论T为何类型,Count变量只有一份,说明泛型类只有一个类实例.
	public GenericTest1()
	{
	     Count++;
	     System.out.println(this.Count);
	}
	public String T2String(T c)
	{
		Count++;
		
		System.out.println(this.Count);
		return c.getClass().toString();
	}
}


public class GenericTest {
  public static void main(String args[])
  {
   //定义类型参数为Integer泛型实例
   GenericTest1<Integer> theInt = new GenericTest1<Integer>();
 //输出theInt的类型为GenericTest1
   System.out.println(theInt.getClass());
   Integer theIntC= new Integer(1);
   System.out.println(theInt.T2String(theIntC));
   //可以如下调用,说明泛型类属于共享性质,而非模板性质.
   System.out.println( GenericTest1.Count);
   
   GenericTest1<GenericTest> theGenericTest = new GenericTest1<GenericTest>();
   //输出theGenericTest的类型为GenericTest1
   System.out.println(theGenericTest.getClass());
   GenericTest theTest = new GenericTest();
   System.out.println(theGenericTest.T2String(theTest));
 //可以如下调用,说明泛型类属于共享性质,而非模板性质.
   System.out.println( GenericTest1.Count);
  }
}

从测试结果可以看出,Java的泛型和C#的泛型存在着本质上的区别,对于Java而言,无论类型参数是什么,其泛型类的类类型(例子中都为GenericTest1)都是一样的,类成员都是共享的,理解这点还是非常有用(Java中泛型做类型测试(instanceof)没有意义的根本原因).Java这样做的目的是为了向下兼容.而C#经常重构.当然,这无关两种处理方式的好坏,目的就是为了更好的利用这些特性.

分享到:
评论

相关推荐

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

    java李兴华学习笔记之泛型

    收集的java李兴华老师的课件笔记。感觉还不错,适合回顾和新手补习。

    Java泛型学习笔记.pdf

    Java泛型学习笔记.pdf

    Exer.java(JavaSE泛型学习笔记)

    泛型学习笔记2的源代码,泛型 : 要解决类型的安全问题, 如果使用Object类型会带来类型的损失。典型的应用就是在集合中, 集合中理论上可以保存任意对象,实际上我们应该让它泛型化,集合类&lt;元素类型&gt;, 添加元素...

    Java学习笔记7.0

    《Java JDK6学习笔记》是作者良葛格本人近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型...

    Java泛型,深入学习java的不二之选.md

    java泛型详细学习,深入学习java的不二之选

    java基础学习笔记之泛型

    所谓泛型,就是变量类型的参数化。泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的...

    java学习笔记 初学者必读

    1.1. JAVA特点 1-4 1.2. 运行原理 1-4 1.3. JAVA目录 1-4 2. 一•基础知识 2-4 2.1. 配置环境 2-4 2.2. Java中基本概念 2-5 3. 二•定义,关键字和类型 3-5 3.1. 注释的三种形式 3-5 3.2. Java代码中的“;”、“{}...

    Java学习笔记(必看经典)

    本书是作者近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型、J2SE中标准的API等均进行了...

    基于Java的源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于Java的源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    java多线程反射泛型及正则表达式学习笔记和源码.zip

    java多线程反射泛型及正则表达式学习笔记和源码.zip

    java学习笔记 传智博客java笔记

    详细的描述了java的基本知识,配合看java视频更好了。 笔记中有集合,泛型,线程,的详细案例,还有java.net的资料

    泛型笔记学习2009

    此word学习文档适合泛型入门的人学习,对泛型的介绍内容详细,其中内容均为本人从网上搜集整理。

    JAVA学习笔试(数据基础+泛型编程)-适合小白

    自己整理的JAVA学习笔记,非计算机专业,包括数据基础和泛型编程,集合,多线程,IO流,网络部分未上传,如果觉得对你有帮助就很棒啦!

    java笔记.zip

    尚硅谷康师傅java学习笔记。 、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 ...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...

    java泛型.xmind

    自己总结的java泛型的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者

    JAVA学习笔记第十四天

    JAVA学习笔记第十四天——字符集编码解码、泛型的使用、数据结构栈和链表、集合框架&List,示例代码,里面主要是知识点的具体使用和各种现象。

Global site tag (gtag.js) - Google Analytics