【发布时间】:2018-09-16 23:07:33
【问题描述】:
我有一个 Java 类 Model,它为我的远程数据库中的一些数据建模。我希望我项目中的所有数据模型都能够从 Map<String, Object> 实例提供构建器(实际上,我正在使用带有 Firestore 的 SnapshotParser<Model> 解析器,但我只会在每个模型中调用 getData()) .这应该类似于:
public class Model {
private String name;
public Model(String name) { this.name = name; }
public static SnapshotParser<Model> getDocParser() {
return docSnapshot -> {
Map<String, Object> data = docSnapshot.getData();
return new Model(data.getOrDefault("name", "John Doe"));
};
}
}
请注意,我将有几个模型(Model2、Model3...),它们也需要提供这样的接口。为了强制执行此行为,我为我的模型类创建了一个 DocParserSupplier 泛型类来实现:
public interface DocParserSupplier<T> {
static SnapshotParser<T> getDocParser();
}
这不起作用有两个原因(Android Studio 告诉我):
-
static接口的方法必须有一个默认实现。不知道T,我做不到。 - 我收到“
T无法在静态上下文中引用”错误。
如果从上面的界面中删除 static 关键字,我可以做我想做的,但它需要我创建一个 Model 的实际实例来获取解析器。它会起作用,但如果方法是静态的,它会更有意义。
有没有 Java 方法可以做我想做的事?
编辑:我的具体用例是将RecyclerViews 与我数据库中的文档进行匹配。构造FirestoreRecyclerOptions对象需要解析器将键值数据转换为Model:
FirestoreRecyclerOptions<Model1> fro1 = new FirestoreRecyclerOptions.Builder<Model1>()
.setQuery(query1, Model1.getDocParser())
.build();
FirestoreRecyclerOptions<Model2> fro2 = new FirestoreRecyclerOptions.Builder<Model2>()
.setQuery(query2, Model2.getDocParser())
.build();
【问题讨论】:
-
@mszymborski
static方法允许在从 Java SE 8 开始的接口中使用。它们只是不被子类型继承。 -
两件事 - 既然你提到了 Android Studio,我将把 android 标签放在这里。第二:为什么你需要这是一个静态方法?这有一种味道,因为您希望每种解析器类型都不同,因此您可能应该寻找一些具体定义的方法。
-
您需要实例方法来对您的对象强制执行某些行为。
-
@Makoto 解析器的行为取决于类本身,而不是实例;我需要它是静态的,但在我的用例中,我需要解析器而不需要
Model的实际实例。 @Bhesh Gurung 我不明白你的评论
标签: java android generics interface static