废话Java泛型编程
# 什么TMD叫泛型?
泛型泛型,把“泛”和“型”两个字展开来看不就得了吗。
- 一个“泛”,指“广泛、泛化”
- 一个“型”,指“数据类型”
连起来不就是“广泛的数据类型吗”?
# So, 什么是泛型编程
代码一样,但数据类型不同。让数据类型参数化,以重用相同的代码。
泛型类的类型参数只能是参考类型,也就是说,泛型只处理对象。(原始数据类型可用包装类代替)
这么说来,泛型编程并不是与面向对象对立的编程方法嘛。它是不是更像是面向对象编程的延展嘞。
泛型允许我们使用相同的类和方法来处理不同的类型:
class GenericType<T> {
private T t;
public GenericType(T t) {
this.t = t;
}
public T get() {
return t;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
GenericType<String> instance1 = new GenericType<>("abc");
String str = instance1.get();
GenericType<Integer> instance2 = new GenericType<>(100);
Integer num = instance2.get();
1
2
3
4
5
2
3
4
5
# 在 Java 5 引入泛型之前怎么做的
在 Java 5 引入泛型之前,使用Object
类来做这件事儿。
class NonGenericType {
private Object object;
public GenericType(Object object) {
this.object = object;
}
public Objcet get() {
return this.object;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
NonGenericType instance = new NonGenericType("I'm a object.");
String str = instance.get(); // Exception!
String str = (String) instance.get(); // Right. Must explicit type-casting
1
2
3
4
5
2
3
4
5
# Object
VS Generic
# Generic 可以不写 <T>
?
这是可行的。即使它长得更像“Non-Generic”,但它仍然是泛型类。这种情况下,字段类型为Object
。
GenericType instance = new GenericType("my-string");
1
上面的代码等同于下面的代码:
GenericType<Object> instance = new GenericType<>("abc"); // it is parameterized with Object
1
当然,通常是没有人这样用的。
编辑 (opens new window)
上次更新: 2022/12/03, 17:31:39