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

标签 java generics syntax static factory

这是我得到的:

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>();
    }
...
}

我的问题实际上只是关于泛型的语法以及静态工厂方法的语法。我不太明白为什么我们在方法声明中将 放在返回类型之前。是不是有点像类型转换?任何帮助将不胜感激!

最佳答案

您要问的是类型推断

由于它是一个静态方法,它必须从某个地方推断出 Generic 类型;您没有该类的实例。这就是 <T>方法。

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

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 部分中进行了介绍。和 15.12.2.8 JLS.

关于Java 泛型和静态工厂方法——语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20751867/

相关文章:

java - 支柱 1 : How may I pass data between Actions?

java - 如何在Spring Tool Suite中生成hibernate配置文件?

java - 如何将改造 JSON 响应转换为列表?

java - 通过 GAE 上的 objectify 强制实现强一致性

java - 如何在没有原始类型的情况下使用泛型类型参数编写 Lambda

java - 在不对返回类型进行类型转换的情况下调用工厂

jquery - 未捕获的异常 : Syntax error, 无法识别的表达式 jQuery

php - MySQL 括号?

generics - 泛型类型的泛型构造函数的显式类型注释

c# - 在 C# 中使用 'var' 关键字会影响性能吗?