Java中常见到以下定义的类
public class Node<T> {
T data;
public Node<T> next;
Node(T data) {
this.data = data;
this.next = null;
}
}
这里的Node<T>是什么意思?
解释
T是自定义泛型,泛型的主要目的是实现 java的类型安全,消除了强制类型转换
使用上面的类定义如下
Node tmp1 = new Node(data);
Node<Integer> tmp2 = new Node<Integer>(data);
前者会有编译的警告,即便它能够执行;但是后者是没有警告的,同时限定了data 是Integer类型的
这种定义方式的类,比如List,
public interface List<E> extends Collection<E>
现在版本的jdk可以少写一个类型
List<String> dtr = new ArrayList<>();
PS:还有个好处,就是如果想要定义class Node<String> 和 class Node<Integer> 两个类,那么使用泛型的话,只要定义一个类Node<T> 就好了
<T> T和T的区别?
以下参考:https://segmentfault.com/q/1010000009171736
问题
为什么会报错?first不就是T类型吗?还有<T> T和T有什么区别?
回答
如果你希望 getMax 方法的返回值类型为 T,就要这样去定义getMax方法:
public T getMax()
如果你希望 getMax 方法返回值的类型由调用者决定,那么就这么去定义 getMax 方法:
public <A> A getMax() {
//...
return (A)result;
}
这里的 A ,一定不能与类名声明的 T 是同个字母。
简而言之,你说的 T 和 <T> T 根本是两种不同的用途。
?通配符泛型
以下参考:https://www.cnblogs.com/Vcanccc/p/5701351.html
?和T都表示不确定的类型,但如果是T的话,函数里面可以对T进行操作
泛型三种:
[1]ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T类型
[2]ArrayList<?> al=new ArrayList<?>();集合元素可以是任意类型,这种没有意义,一般是方法中,只是为了说明用法
[3]ArrayList<? extends E> al=new ArrayList<? extends E>();
泛型的限定:
? extends E:接收E类型或者E的子类型。
?super E:接收E类型或者E的父类型。
原创文章,欢迎转载,转载请注明出处!