在Java中对泛型类型参数调用静态方法
我希望在Java中有类似的内容:在Java中对泛型类型参数调用静态方法,java,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)
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)
}
}
如何在
Query
类中编写fetch
函数 只需传递类型为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)
}
公共列表获取(T实例){
//获取表名,instance.TableName();
//从/api获取/
//解析并返回数据,instance.parseJSON(jsonData)
}
这是不可能的;T
的具体实例在编译时是未知的,而编译时是解析所有静态方法的时候
一种常见的方法是将查询抽象化,并提供一种方法:
protected abstract T parse(String data);
您还可以使用组合:让Query
在其构造函数中获取函数
,并在fetch()中使用它。但无论如何,您必须在运行时解决一些问题,这对于静态方法是不可能的
如果使用组合方法,则可以将json读取函数传递给每个方法,而不是构造函数:
public List<T> fetch(Function<String, T> parser) {
...
}
为什么这些方法需要是静态的?它们不需要是静态的。但是,如果它们是实例方法,我没有使用它们的文章
对象。如何为列表创建多个t
实例?如何在一个无界泛型T
上调用instance.parseJSON
?这两个问题都是可以解决的,但是当你解决它们的时候,你基本上已经用一种更复杂的方式写了一个函数了。我不是说这是一个“好方法”,我只是想在OP创造的条件下给他一个答案。更好的方法是提供一个fetch
,它使用一个实例来描述所需的所有信息。
public List<T> fetch(Function<String, T> parser) {
...
}
public class Query {
public List<T> fetch(Function<String, T> parser) {
...
}
}