Node<T> 的作用

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的父类型。

原创文章,欢迎转载,转载请注明出处!

原文地址:https://www.cnblogs.com/acm-bingzi/p/noteT.html