java - 泛型类,了解泛型参数

标签 java generics

我无法理解 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/

相关文章:

java - 为什么 JEditorPane 不显示用 HTML 编写的图像?

java堆空间和消息丢失

javascript - 使用 typescript 和泛型编写库

Java 如何使用 Set 参数化泛型方法?

c# - 通过 wcf 序列化谓词

java - ClassNotFound 专家 war

java - 读取变量时出现 NoSuchElementException

java - 如何使用Java API正确访问Hadoop 3.2.1?

c# - List<Interface> 的 object[] 返回 null

java - 泛型 <? super> 通配符在带有方法引用或 lambda 的 java 1.8 中不起作用