为什么要有 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