主题:【原创】Java 1.5新特点的一些体验 -- 老兵帅客
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++一样,可以把人搞得发疯了。
- 相关回复 上下关系8
4. Autoboxing and Unboxing 老兵帅客 字418 2004-10-02 18:36:38
3. Enumerated Types 老兵帅客 字2188 2004-10-02 18:25:47
.NET的enum和Java不一样,不是Class. Highway 字1283 2004-10-03 21:01:28
2. Generics
这里又一篇关于C# Generics的详细介绍,比较不错! Highway 字107 2004-10-02 06:56:30
1.3 Ordering Queues Using Comparators 老兵帅客 字1658 2004-10-01 16:46:18
.NET中有类似的东西。由于.NET使用delegate,而不是 Highway 字57 2004-10-01 16:57:05
1.2 Using Queues 老兵帅客 字953 2004-10-01 16:33:01