乐趣区

关于java: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<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
退出移动版