泛型是一种代码级的有效复用手段,理解泛型的机制有利于更好的编写程序.
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多线程反射泛型及正则表达式学习笔记和源码....
"Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...
此外,《JAVA学习笔记》还涵盖了集合框架,包括ArrayList、LinkedList、HashSet、HashMap等各种集合类的使用,以及泛型、迭代器和流API的应用。这些内容对于处理数据和实现复杂算法至关重要。 对于多线程编程,书中...
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...
泛型学习笔记2的源代码,泛型 : 要解决类型的安全问题, 如果使用Object类型会带来类型的损失。典型的应用就是在集合中, 集合中理论上可以保存任意对象,实际上我们应该让它泛型化,集合类<元素类型>, 添加元素...
这份《Java学习笔记》包含了丰富的知识内容,旨在帮助学习者全面掌握Java编程技术。笔记分为7个PDF部分,覆盖了从基础到高级的Java编程概念。 1. **Java基础知识**:这部分内容通常包括Java的历史背景、环境配置、...
《林信良Java学习笔记》是一本深受程序员喜爱的Java学习资源,尤其因其繁体字版,对于中文读者来说,提供了更为亲切的阅读体验。这本书深入浅出地讲解了Java编程语言的基础知识和高级特性,旨在帮助初学者快速掌握...
《良葛格java学习笔记》是一份集合了Java学习精华的资源,主要针对初学者和对Java编程感兴趣的读者。这份笔记是由用户从良葛格的网站上精心整理并转化为CHM格式,便于阅读和查阅。CHM(Compiled Help Manual)是微软...
学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...
Java学习笔记源代码是针对清华大学出版的《Java学习笔记》一书,配套的 JDK1.5 版本的源码。这些源代码旨在帮助读者深入理解Java编程语言,通过实践来加强理论学习,提高编程技能。Java作为一种广泛使用的高级编程...
【良格葛的Java学习笔记】是一份专为学习Java编程语言而编写的教程资料,由作者良格葛精心整理而成。这份笔记以其独特的视角和深入浅出的讲解方式,深受学习者喜爱,尤其适合初学者及有一定基础的开发者进行进阶学习...
泛型是Java编程语言中的一个重要特性,首次在JDK 1.5版本中引入,它允许程序员在定义类、接口和方法时使用类型参数,从而实现了类型的安全性和代码的复用性。泛型的主要目标是增强类型安全,避免在运行时出现...
java泛型详细学习,深入学习java的不二之选
《良葛格Java学习笔记(完整版)》是一份全面且深入的Java编程教程,适合不同层次的Java学习者,无论你是初学者还是有经验的开发者,都能从中受益。这份笔记详细介绍了Java语言的核心概念、语法特性以及实际开发中的...
泛型是Java语言的一个重要特性,它主要解决了在集合框架中频繁出现的类型转换问题,同时也增强了类型安全性。泛型的概念最早出现在Java 5.0版本中,它允许开发者创建能够以类型参数化的类、接口和方法。 #### 泛型...
这份“Java学习笔记”是为初学者准备的,旨在帮助他们快速掌握Java的基础知识。笔记中可能涵盖了以下重要知识点: 1. **Java简介**:Java是由Sun Microsystems(现已被Oracle收购)开发的,它的设计目标是“一次...
这份"JAVA学习笔记和例子程序值得看看"的压缩包显然包含了作者在深入学习Java过程中的重要发现和理解,以及帮助深化概念理解的示例程序。让我们来详细探讨一下可能包含的知识点。 1. **基础语法**:Java的基础包括...