我无法理解 eclipse 提示的原因。 我有两个接口(interface):
@Preload
public interface KBaseAo extends FAQ
{
public static final String ID = "BASE_KEY";
}
public interface FAQ extends Entity {
@Unique
@NotNull
String getBaseKey();
void setBaseKey(String baseKey);
@NotNull
String getExcerpt();
void setExcerpt(String excerpt);
}
其中实体接口(interface):
public interface Entity extends RawEntity<Integer> {
@AutoIncrement
@NotNull
@PrimaryKey("ID")
public int getID();
}
具体类如下所示:
public class FAQServiceImpl<T extends FAQ> {
private void save(Class<T> clazz, String ID_FIELD, String key, String excerpt) {
T entity = (T) aoManager.create(clazz, new DBParam(ID_FIELD, key),
new DBParam("EXCERPT", excerpt));
entity.save();
}
private <T extends FAQ> void save2(Class<T> clazz, String ID_FIELD, String key, String excerpt) {
T entity = (T) aoManager.create(clazz, new DBParam(ID_FIELD, key),new DBParam("EXCERPT", excerpt));
entity.save();
}
public Map<String, String> fetchExcerptsFor(Set<String> bodies) {
//call save2 or save here
}
}
我正在尝试调用另存为
save(KBaseAo.class, "SomeID", "SomeStr", "SomeStr");
这给出了编译错误
The method save(Class<T>, String, String, String) in the type FAQServiceImpl<T> is not applicable for the arguments (Class<KBaseAo>, String, String, String)
调用 save2 完全相同
save2(KBaseAo.class, "SomeID", "SomeStr", "SomeStr");
完美编译,但覆盖了 T 类型。
我缺少什么并且无法使 save() 工作?
编辑: 添加了两次保存的调用代码
最佳答案
您的 save
方法使用类级类型变量 T
。这样做时,您要求编译器确保仅使用其类型与实例的泛型类型完全匹配的类实例调用此方法。
例如:
FAQServiceImpl<FooFAQ> instance = new FAQServiceImpl<>();
instance.save(FooFAQ.class, "", "", "", ""); // Fine.
您不能使用某个恰好实现了 FAQ
的任意类来调用它,因为它与实例
的类型不匹配:
FAQServiceImpl<FooFAQ> instance = new FAQServiceImpl<>();
instance.save(BarFAQ.class, "", "", "", ""); // Compiler error.
但这就是您当前在代码中所做的事情:您说 FAQServiceImpl
有一个泛型类型 T
,但您想使用特定的方法调用该方法输入KBaseAo
:
FAQServiceImpl<T> instance = new FAQServiceImpl<>();
instance.save(KBaseAo.class, "", "", "", ""); // Compiler error.
(即使这发生在类的实例方法内部)。
但是,save2
定义了一个新的类型变量,该变量恰好具有相同的名称T
。这个新类型变量和类级变量T
之间没有关系。
因此,save2
的声明不需要类匹配:它只需要一些 实现FAQ
的类。
关于java - 泛型类,了解泛型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34404993/