为什么要有 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<User> userList;
告知编译器 == 限度其放入的具体类型 == 即告知编译器, 这个数据的类型只能在我划定的范畴内, 若在范畴外, 则报错!
例如 <Integer> 示意, 限定放入的数据类型是 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<Object> list = new ArrayList<>();
List list = new ArrayList<>();
Son son = new Son();
// 容许放入, 因为 Son 句柄是 Object 的子类
list.add(son);
printList(list);
}
}
参考
- Generics what does actually mean? [duplicate]
- Wildcards