Java 运行时如何获取泛型参数的类型

在 Java 中对于下面最简单的泛型类

class A<T> {
    public void foo() {
        //如何在此处获得运行时 T 的具体类型呢?
    }
}

设想我们使用时

new A<String>().foo();

是否能在 foo() 方法中获得当前的类型是 String 呢?答案是否定的,不能。在 foo() 方法中 this 引用给不出类型信息,this.getClass() 就更不可能了,因为 Java 的泛型不等同于 C++ 的模板类,this.getClass() 实例例是被所有的不同具体类型的 A 实例(new A<String>(), new A<Integer>() 等) 共享的,所以在字节码中类型会被擦除到上限。

我们可以在 IDE 的调试时看到这个泛型类的签名

阅读全文 >>

类别: Java/JEE. 标签: , . 阅读(195). 评论(0) »

步步理解 JAVA 泛型编程(三)

前面介绍的无论是泛型类还是泛型方法,基本上都是把定义的类型参数作为一个整体来操作,放到数组或取出来,顶多就是调用了一下 hashCode() 方法,因为这是 Java 的根对象拥有的方法。比如说一个泛型数组,要得到其中的最小元素:

package com.unmi;

/**
 * 泛型,类型变量的限定
 * @author Unmi
 */
public class ArrayAlg {

	public static <T> T main(T[] a){
		if(a==null || a.length ==0){
			return null;
		}
		T smallest = a[0];
		for(int i=0;i<a.length;i++){
			if(smallest.compareTo(a[i])>0){
				smallest = a[i];
			}
		}

		return smallest;
	}
}

阅读全文 >>

类别: Java/JEE. 标签: , . 阅读(1,998). 评论(3) »

步步理解 JAVA 泛型编程(二)

前面讲了泛型类的定义,你也可以在一个普通类中单单定义一个泛型方法。也就是说类能够带个类型参数,方法也可以带类型参数的。还是来看个例子(包括如何应用),一个获得数组中间元素的方法,因为数组中存储元素的类型是不定的,所以把该方法定义成泛型的。

package com.unmi;

/**
 * 泛型方法示例
 * @author Unmi
 */
public class ArrayAlg {

	//这个就是在普通类 ArrayAlg 中定义的泛型方法
	public static <T> T getMiddle(T[] a){
		return a[a.length/2];
	}

	public static void main(String[] args) {
		String[] names = {"Fantasia","Unmi","Kypfos"};
		//String middle = ArrayAlg.<String>getMiddle(names);

		//上面那样写是可以,编译器可推断出要调用的方法,所以省去<String>
		String middle = ArrayAlg.getMiddle(names);
		System.out.println(middle);
	}
}

阅读全文 >>

类别: Java/JEE. 标签: , . 阅读(1,002). 评论(9) »

步步理解 JAVA 泛型编程(一)

JDK 1.5 相对于 JDK 1.4 来说变化最大的部分就是泛型,甚至可以说自 Java 1.0 发布以来也是最大的一次语言变化,因为要涉及到编译器的大改动。很早的时候大家对泛型的呼声很大,正如 C++ 的模板,C# 的泛型确实是个值得借鉴的好特性。JDK1.5 这前,很多人对于泛型是急不可耐,在 JDK1.4 下搭配一个外挂的 Generic Java 编译器,通老实 -Xbootclasspath、-bootclasspath 同样能让你在 1.4 的 JDK 上使用泛型:

javac -J-Xbootclasspath/p:JSR14HOME\gjcrt.jar -bootclasspath JSR14HOME\collect.jar;JDK141HOME\jre\lib\rt.jar -source 1.5 FileName.java
java -Xbootclasspath/p:JSR14HOME\gjc-rt.jar FileName 阅读全文 >>

类别: Java/JEE. 标签: , . 阅读(1,280). 评论(3) »