为什么要有 Java 泛型
Java 所有的实例, 都有一个确切的类型. 但一个实例可以将其当做不同的类型, 这种操作称之为多态
实例: new 出来的. 又名对象, 包含数据
如一个 Father 句柄, 其指向可以是一个 Son 类 (是Father的子类), 也可以是一个 Father类
但我们可以通过使用 Java 里的 getClass 函数 获得其原本的类型
class Father {
}
class Son extends Father {
}
public class Main {
public static void main(String[] args) {
Father father = new Son();
System.out.println(father.getClass().toString());
// 打印出 Son
}
}
但多态也带来一个问题, 拿到一个Object[ ], 根本不知道里面装的是什么, 没有限制范围, 即这个类大致长什么样不知道.
当然, 放进去的人肯定知道是什么, 但过了一段时间应该会忘记的...
想象有一天写代码的时候, 拿着一个 ArrayList
ArrayList userList;
想着里面一定是装的是 User 类, 然后遍历时, 不知道谁往里面放置了一个 Tool 类, 导致程序出错. 这时你一定会想, 编译器为什么不帮我做检查 ???
编译器此时想的是, 所有东西都视为 Object, 我没错!
于是泛型便诞生
ArrayList userList;
告知编译器==限制其放入的具体类型== 即告知编译器, 这个数据的类型只能在我划定的范围内, 若在范围外, 则报错!
例如表示, 限定放入的数据类型是 Integer
所以如果你想对要放入的元素进行类型约束的话, 可以采用泛型解决
前提是你要知道你想放入什么类型的元素.
>
? 在 Java 中属于通配符, 作为参数、字段或局部变量的类型. 表示可以是任意类型.
这里我感觉跟泛型的使用前提就违背了,
- ? 可以放入任意类型
- 泛型是用于约束对象类型
那可以放入任意类型, 那就意味着没有约束.
网上看到很多人解释说 > 仅仅是向别人表示我没有忘记泛型, 但这里真的允许放入任意类型. 而 Java 官方说法是 ? 代表任意类型.
到此我感觉就是为了强行使用泛型, 显得代码符合规范....
public class Main {
public static void printList(List> list) {
// 必须是 Object 因为 list 允许为任意类型
for (Object elem: list)
System.out.print(elem + " ");
System.out.println();
}
public static void main(String[] args) {
List> list = new ArrayList<>();
Son father = new Son();
// 会报错, 无法往list里放入任何东西, 哪怕是 Object, 至于为什么, 我暂时也不清楚
list.add(father);
}
}
public class Main {
public static void printList(List> list) {
for (Object elem: list)
System.out.print(elem + " ");
System.out.println();
}
public static void main(String[] args) {
// 泛型擦除, 由于 List 的泛型没有做任何限定, 可以等同于 List