五千年(敝帚自珍)

主题:【原创】Java 1.5新特点的一些体验 -- 老兵帅客

共:💬14
全看分页树展 · 主题 跟帖
家园 2. Generics

Java 1.5中的Generics和C++的Template其实现几乎是一样的,也就是说,如果读者熟悉C++的Template,它也就熟悉Java 1.5中的Generics。但是Java 1.5中的Generics也有一些有趣的地方:

一。Type Wildcards,就是Template的具体类型不定。下面是一个例子。

public void printList(List<?> list, PrintStream out) throws IOException {

for (Iterator<?> i = list.iterator( ); i.hasNext( ); ) {

out.println(i.next( ).toString( ));

}

}

在这个例子中,我们可以发现Template的具体类型没有确定而依然还是个?虽然这意味着更多的不确定性和错误,但是它也确实提供了更多的灵活度。(注:这个例子在我的环境中没有通过检查,虽然它在含义上是明确的)。

二。Restricting Type Parameters,也就是逐渐受到约束的类型参数。这是一个很好的改进,在我的记忆里,它比C++的Template做的要好。下面是一个例子:

package test2005_2;

import java.util.Iterator;

import java.util.ArrayList;

import java.util.List;

class Box<T> {

protected List<T> contents;

public Box() {

contents = new ArrayList<T>();

}

public int getSize() {

return contents.size();

}

public boolean isEmpty() {

return (contents.size() == 0);

}

public void add(T o) {

contents.add(o);

}

public T grab() {

if (!isEmpty()) {

return contents.remove(0);

} else {

return null;

}

}

}

public class NumberBox<N extends Number> extends Box<N> {

public NumberBox() {

super();

}

// Sum everything in the box

public double sum() {

double total = 0;

for (Iterator<N> i = contents.iterator(); i.hasNext(); ) {

total = total + i.next().doubleValue();

}

return total;

}

}

这里NumberBox<N extends Number>是对Box<N>的一个限定,它使得N必须是对Number的扩展。

相对应的,我们可以有以下两种改写的sum方法:

public static double sum(Box<? extends Number> box1,

Box<? extends Number> box2) {

double total = 0;

for (Iterator<? extends Number> i = box1.contents.iterator( );

i.hasNext( ); ) {

total = total + i.next( ).doubleValue( );

}

for (Iterator<? extends Number> i = box2.contents.iterator( );

i.hasNext( ); ) {

total = total + i.next( ).doubleValue( );

}

return total;

}

public static <A extends Number> double sum(Box<A> box1,

Box<A> box2) {

double total = 0;

for (Iterator<A> i = box1.contents.iterator( ); i.hasNext( ); ) {

total = total + i.next( ).doubleValue( );

}

for (Iterator<A> i = box2.contents.iterator( ); i.hasNext( ); ) {

total = total + i.next( ).doubleValue( );

}

return total;

}

这样做的一个副作用就是Java开始和C++一样,可以把人搞得发疯了。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河