我想在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
定义其特定的tableName
和parseJSON
函数。例如,
class Article {
public static String tableName() {
return "article";
}
public static List<Article> parseJSON(String jsonData) {
// Parse the json, build the articles
}
}
如何在fetch
课程中编写Query
函数?
答案 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) {
...
}
}