请问这里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这个泛型类型。

       ...

    }

}


3
0

Google面试官亲授-Java面试新手尊享课

为面试新手量身定制的Java面试尊享课,解锁“鲤鱼跃龙门”的妙招

2853 学习 · 180 问题

查看课程