Java 泛型和静态工厂方法 -- 语法

2023-12-19

这是我所得到的:

public class Node<T> {

    // instance variables
    private Node<T> next;
    private T data;

    // construct with data
    private Node(T data){
        next = null;
        this.data = data;
    }

    // construct without data
    private Node(){
        next = null;
        this.data = null;
    }

    // static factory method
    public static <T> Node<T> newNodeWithData(T data){
        return new Node<T>(data);
    }

    // static factory method
    public static <T> Node<T> newNode(){
        return new Node<T>();
    }
...
}

我的问题实际上只是关于泛型的语法与静态工厂方法的语法相结合。我不太明白why我们在方法声明中将放在返回类型之前。这有点像打字吗?任何帮助将非常感激!


你要问的是类型推断.

因为它是一个静态方法,所以它必须从某个地方推断出泛型类型;您没有该类的实例。这就是<T> means.

如果您的方法不带参数,它实际上是从赋值的目标推断出来的。例如,假设您的方法如下所示:

public static <T> List<T> getNewList() {
    return new ArrayList<T>();
}

使用此方法时,T是从目标推断出来的(在本例中String):

List<String> myList = MyClass.getNewList();

在您有通用参数的其他静态方法中,T是从传入的类型推断出来的:

public static <T> List<T> getNewListWithElement(T element) {
    List<T> list = new ArrayList<T>();
    list.add(element);
    return list;
}

在这里,如果您尝试这样做:

List<String> myList = MyClass.getNewListWithElement(new Integer(4));

它会告诉你你的目标类型是错误的,你需要一个List<Integer>

具体来说,这在各节中都有介绍15.12.2.7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7 and 15.12.2.8 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.8JLS 的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 泛型和静态工厂方法 -- 语法 的相关文章

随机推荐