Java

为什么要有 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 list = new ArrayList<>();
        List list = new ArrayList<>();
        Son son = new Son();
        // 允许放入, 因为 Son 句柄是 Object 的子类
        list.add(son);
        printList(list);
    }
} 
 

参考

你可能感兴趣的:(java泛型)