Java Generic Tutorial 摘记

java generic

摘自
Generics in the Java Programming Language
Gilad Bracha
July 5, 2004

希望对从C#转Java的朋友有点帮助

[b]最基本的[/b]
List<String> ls = new ArrayList<String>(); //1 没问题
List<Object> lo = ls; //2 编译错误,这应该是一个协变过程,c#4.0已经支持


[b]通配符[/b]
考虑设计一个方法:


// 非泛型写法
void printCollection(Collection c) {
Iterator i = c.iterator();
for (k = 0; k < c.size(); k++) {
System.out.println(i.next());
}
}
// 泛型写法,比普通写法反而多了限制,参数入口类型更严格了,但却没有带来任何好处
void printCollection(Collection<Object> c) {
for (Object e : c) {
System.out.println(e);
}
}
// 使用带通配符的泛型,入口宽松
void printCollection(Collection<?> c) {
for (Object e : c) {
System.out.println(e);
}
}

List<?> listUnknown = new ArrayList<Strign>();
listUnknown.add(null); // ok, null is subtype of any type
listUnknown.add(new Object()); // compile error, unknown type ?
listUnknown.get(0).toString(); // ok, list element must be type of Object


[b]限定通配符[/b]
public abstract class Shape {
public abstract void draw();
}
public class Circle extends Shape {
@Override
public void draw() {
}
}
public class Rectangle extends Shape {
@Override
public void draw() {
}
}
public static void drawall(List<? extends Shape> shapes) {
for(Shape s : shapes) {
s.draw(); // ok
}
}
public static void addShape(List<? extends Shape> shapes) {
shapes.add(new Rectangle()); // complie error
// don't know whether ? is Rectangle's super type
}

[b]泛型方法[/b]
static void fromArrayToCollection(Object[] a, Collection<?> c) {
for (Object o : a) {
c.add(o); // compile time error
}
}
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
for (T o : a) {
c.add(o); // correct
}
}


[b]后记[/b]
[list]
[*]通配符的目的是在不同的调用位置使用不同的类型参数,它比泛型方法中的类型参数应用范围更广(如可以用来声明变量),使用也更灵活。
[*]而泛型方法则只有在方法体或返回值依赖于入口参数类型时才应该使用(其它情况优先使用通配符)。
[/list]
class Collections {
public static <T, S extends T> void copy(List<T> dest, List<S> src){...}
}
// 可以重写为:
// 因为方法体内并没有对S的依赖。
class Collections {
public static <T> void copy(List<T> dest, List<? extends T> src){...}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值