在项目开发中我们会不可避免的使用到泛型,java中的泛型对于初学者来说比较难理解,希望这个帖子能够引入高手对于java泛型的讨论。
一下是我理解中泛型的作用:
public class Holder<A, B> {
public final A a;
public final B b;
public Holder(A a, B b) {
this.a = a;
this.b = b;
}
public static void main(String args[]) {
String first = "This is a member of class Holder named A";
String second = "This is a member of class Holder named B";
Holder<String, String> holder = new Holder<String, String>(first,
second);
System.out.println(holder.a);
System.out.println(holder.b);
}
}
以上泛型的作用之一:一个方法返回两个参数。
看了一下的代码你就会明白如何使用java泛型实现“一个方法返回两个参数”
public Holder<int,String>getTwoParameters(){
int first=0;
String second ="I am the second parameter";
return new Holder<int,String>(first,second);
}
相当简单,如果你要在代码中获取这两个参数,也相当方便:
Holder<int,String> holder= getTwoParameters();
int first = holder.first;
String second = holder.second;
值得注意的是,first 和second两个参数不会改变原先生成的holder中的参数中,first是int型(基本数据类型),second是String型(引用数据类型),如果对first重新赋值则会改变first在内存区的值,而对second赋值,则会让second指向另外一个String类型的内存区。以上两种都不会改变原先holder对象中的值,如果你在使用Holder类的对象时,想进行如下操作:
holder.first = 3;
holder.second = 4;
final类型的first和second会阻止你这么做,因为final保护了first和second不会被改变。这就体现了泛型代码的可读性和安全性,真心让人觉得Sun的牛X所在。
以上分析的都是泛型类的使用方法,下面来考虑一下泛型函数的使用。
泛型函数最简单的使用就像这样:
public <T, M, D> void generosityFunction(T member1, Math member2,
Deprecated member3) {
System.out.println(member1.getClass().getName());
System.out.println(member2.getClass().getName());
System.out.println(member3.getClass().getName());
}
这种方法可以写一个函数,但是其形式参数是未知类型,也就是说可以传入任何类型的参数作为该方法的形式参数。
这种方法的功能及其有限,因为方法体本身并不知道传入的形式参数到底是什么类型的,所以无法在方法体内对这个参数进行各种有效的操作。
举个简单的例子:使用以上方法传入参数
generosityFunction(1,2,3)
在方法体重无法对传入的1,2,3进行具体操作,只能够简单的执行一些打印操作,没有太多的实际用处,除了以下的用法,用来快捷的创建容器类,而且封装性较好,代码的可读性比较高,一看就懂:
//新建一个Map对象
public static <K, V> Map<K, V> newAMap() {
return new HashMap<K, V>();
}
//新建一个List对象
public static <T> List<T> newAList() {
return new ArrayList<T>();
}
public static void main(String args[]) {
List<String> strings = newAList();
Map<String, Integer> integers = newAMap();
}
希望能人多多指点。
|
|