在Java中调用泛型类型参数的静态方法

时间:2015-12-29 17:37:36

标签: java

我想在Java中有这样的东西:

import java.util.List;

class Query<T> {
    public List<T> fetch() {
        // Get the table name, T.tableName()
        // Fetch from /api/<table_name>
        // Parse and return data, T.parseJSON(jsonData)
    }
}

这里的目的是拥有一个通用查询构建器,而每个类T定义其特定的tableNameparseJSON函数。例如,

class Article {
    public static String tableName() {
        return "article";
    }

    public static List<Article> parseJSON(String jsonData) {
        // Parse the json, build the articles
    }
}

如何在fetch课程中编写Query函数?

2 个答案:

答案 0 :(得分:1)

只需传递T类型的实例,即可访问该类型的方法。注意评论..

public List<T> fetch(T instance) {
    // Get the table name, instance.TableName();

    // Fetch from /api/<table_name>
    // Parse and return data, instance.parseJSON(jsonData)
}

答案 1 :(得分:1)

这是不可能的; T的特定实例在编译时是不可知的,即所有静态方法都已解析。

一种常见的方法是使Query<T>抽象,并提供一种方法:

protected abstract T parse(String data);

您还可以使用合成:让Query在其构造函数中使用Function<String,T>,并在fetch()中使用它。但无论如何,你必须在运行时解析某些,这对静态方法来说是不可能的。

如果使用合成方法,可以将json-reading函数传递给每个方法,而不是构造函数:

public List<T> fetch(Function<String, T> parser) {
    ...
}

请注意,如果您这样做,您甚至可能不需要Query通用;你可以根据需要使每个方法都是通用的:

public class Query {
    public List<T> fetch(Function<String, T> parser) {
        ...
    }
}