// List
// ^
// |
// AbstractCollection <- AbstractList <- ArrayList
ArrayList some_var_0 = new ArrayList();
AbstractList some_var_1 = new ArrayList();
AbstractCollection some_var_2 = new ArrayList();
// или, как в нашем случае, обратиться к интерфейсу, который реализует класс нашего объекта:
List some_var_3 = new ArrayList();
如果预先未知实际对象的类型,则使用此类泛型类型可能会很有用,例如:
List some_var;
switch ( mystic_var ) {
case 0: some_var = new ArrayList(); break; // класс ArrayList реализует интерфейс List
case 1: some_var = new LinkedList(); break; // класс LinkedList тоже реализует интерфейс List
default: some_var = new Vector(); break; // класс Vector тоже реализует интерфейс List
}
我从一个小评论开始,但轻描淡写的感觉迫使我扩大答案。恕我直言,下面的想法应该有助于理解一些重要现象和相关的 OOP 技术。
在Java(以及其他支持OOP的编译编程语言)中,有必要区分对象和变量:
所以在性别表达上
,符号左边的条目
=负责声明变量[<TYPE> some_var],而符号右边的条目负责初始化对象[new <TYPE>()]。 Java 中的类型众所周知是静态的。变量用于访问内存中的对象。如果创建一个指向对象的变量
ArrayList,那么给它一个与对象对应的类型是合乎逻辑的:
但在Java中,变量可以指向继承或实现其类型的任何类型的对象。换句话说,如果类型
B是 type 的后代A,则该类型对象可以由type或 type的变量B指向。BA从这里我们了解到,我们的对象 的类
ArrayList继承自该类AbstractList,而该类又继承自该类AbstractCollection。这意味着我们可以很自由地这样写:如果预先未知实际对象的类型,则使用此类泛型类型可能会很有用,例如:
上面的代码是多态的典型例子,其中一个变量可以指向不同类型的对象。正是由于多态性的可能性,使用更通用类型的变量通常比使用与对象相对应的特定变量更可取。
多态性在支持 OOP 的编程语言中相当常见。即使对于您当前的需求来说没有必要,实现多态性也不会对程序的运行产生负面影响,而是会为程序未来的扩展和重组提供更多的灵活性和范围。不过,同样,可能没有任何必要(特别是如果它的好处尚不清楚)。
全部的
泛型类型的使用是可选的。相反,它是世俗的智慧或生活窍门。