请问这里List<V>的<V>表示什么
来源:8-11 泛型(上)

慕前端7365659
2020-04-12
上课知道表示泛型,但最后出现的表示什么?求老师解答
1回答
-
ccmouse
2020-04-19
我们仔细看本节10:58处附近对于LinkedListDeletor的修改。
<V>或者代码里的<T>,其中的V,T都是要申明,才可以作为泛型类型来使用,申明的作用域是类或者函数。
首先我们看LinkedListDeleter<T>,或者更一般的List<T>等,我们在写类的定义时:
class LinkedListDeleter<T> {
public Node<T> deleteIfEqual(Node<T> head, T value) {
...
}
}
这里就申明了泛型类型T,在这个大括号里面,T就可以作为一个类型来使用。所以Node<T>自然就是类型为T的Node。
那我们实例化的时候,要告诉编译器这个T到底是什么:
Node<Integer> head1 = ...
head1 = new LinkedListDeletor<Integer>().deleteIfEqual(head1, 3);
Node<String> head2 = ...
head2 = new LinkedListDeleter<String>().deleteIfEqual(head2, "abc");
这里我们发现,这个LinkedListDeletor的实例其实并不关心它所操作的LinkedList元素类型到底是什么,其实同一个LinkedListDeletor实例理想的来说,应该可以操作任何类型的LinkedList,比如这样:
LinkedListDeletor deletor = new LinkedListDeletor(); // 我们不想在这里指定是Integer还是String,我们希望这个deletor能同时操作Integer和String
Node<Integer> head1 = ...
Node<String> head2 = ...
head1 = deletor.deleteIfEqual(head1, 3);
head2 = deletor.deleteIfEqual(head2, "abc");
这样的写法对于这个LinkedListDeletor来说,显然是更“好”的。这是可行的,这里,我们的LinkedListDeletor不是泛型类,但里面的deleteIfEqual是个泛型函数,编译器会推断调用的时候这个T是什么类型。
所以:
class LinkedListDeleter { // 这里不再有<T>的申明,一个实例可以同时操作任何类型
public <T> Node<T> deleteIfEqual(Node<T> head, T value) { // 去掉类级别的<T>后,T就成了未定义类型,会编译失败。所以这里我们要在函数之前加上<T>,申明在这个函数中,包括参数,返回值,函数体中,我们有T这个泛型类型。
...
}
}
30
相似问题