【问题标题】:Can somebody explain how parameters work in java hierarchy?有人能解释一下参数在java层次结构中是如何工作的吗?
【发布时间】:2020-09-30 10:03:00
【问题描述】:

我是 java 继承的新手,很难理解这个概念的细节。在我的 Springboot 项目中,我最初有 2 个域类:

public class Excerpt {
    private int excerptID;
    private String author;
    private String title;
    private String text;
    private String comments;
}

public class Tag {
    private int excerptID;
    private String description;
}

DAO 包由通用 DAO 接口组成

public interface DAO<T> {

    public void save(int id, String... params);
    public List<T> getAll();
    public List<T> getByTitle(String... params);
    public List<T> getByTag(String... params);
    public List<T> getByID(int excerptID);
    public int countAll();
    public void delete(int id);
}

和 2 个类实现

public class ExcerptDAO implements DAO<Excerpt> { ... }

public class TagDAO implements DAO<Tag> { ... }

到目前为止一切顺利。但后来我决定添加另一个域类Outline,它将与Excerpt共享Tag数据库表

public class Outline {
    private int outlineID;
    private String title;
    private String plot;
    private String comments;
    private String genre;
    private String resources;
}

DAO 方法也会部分重叠,所以我添加了另一个级别的接口。伞形 DAO 接口:

public interface DAO<T> {

    public void save(int id, String... params);
    public List<T> getAll();
    public List<T> getByTitle(String... params);
    public List<T> getByTag(String... params);
    public List<T> getByID(int id);
    public int countAll();
    public void delete(int id);
}

ExcertpsDAO 和 OutlinesDAO 扩展接口

public interface ExcerptsDAO extends DAO<Excerpt>{
    public List<Excerpt> getByAuthor(String... params);
}

public interface OutlinesDAO extends DAO<Outline> {
    public List<Outline> getByGenre(String... params);
    public List<Outline> getByResource(String... params);
}

我即将将它们实现到类中,但不明白我遇到的错误:

public class ExcerptDAO implements ExcerptsDAO<Excerpt> { ... }

The type ExcerptsDAO is not generic; it cannot be parameterized with arguments <Excerpt>

显然这是正确的

public class ExcerptDAO implements ExcerptsDAO { ... }

但是我不明白为什么参数与ExcerptsDAO界面中的参数相同时不接受。如果参数相同,为什么接口不是通用的很重要?

【问题讨论】:

  • 旁注:您应该为实现和接口考虑更好的名称或不同的命名方案。 IMO ExcerptDAOExcerptsDAO 太相似了,可能会引起混淆。
  • @Thomas,是的,我知道......一旦我解决了实际问题,我就想这样做

标签: java spring-boot parameters hierarchy


【解决方案1】:

如果类或接口不接受泛型参数,则不允许添加一些参数,就像不允许将参数传递给不接受任何参数的方法一样。所以ExcerptsDAO has_no_ 泛型参数并且已经将传递给DAO 的泛型类型修复为Excerpt。所以你不能更改参数,因此不允许添加一个。

总结一下:public class ExcerptDAO implements ExcerptsDAO { ... } 非常好,因为ExcerptsDAO总是只处理Excerpt 实例。

如果您使用ExcerptsDAO&lt;T extends Excerpt&gt; implements DAO&lt;T&gt;,它会起作用,但是您必须始终为ExcerptsDAO 定义一个泛型类型参数,因为它也可能是Excerpt 以外的其他东西。

【讨论】:

    【解决方案2】:

    您尝试为 ExcerptsDAO 声明一个通用参数,但它没有任何参数。但是 DAO 有一个通用参数(参见 DAO&lt;T&gt; 中的 T)。仅当您想创建一个类时才需要泛型,嗯,更通用。

    例如如果你想创建一个 ExcerptsDAO 不仅仅是你的 Excerpts 而是其他类(在这种情况下这当然没有意义)你可以创建一个通用参数。

    public interface ExcerptsDAO<T> extends DAO<T>{
        public List<T> getByAuthor(String... params);
    }
    

    我认为在这种情况下您不需要泛型。

    【讨论】:

      【解决方案3】:

      我的你需要像这样改变一点

      change : 
      
      ExcerptsDAO extends DAO<Excerpt>
      to
      ExcerptsDAO<T> extends DAO<T>
      

      ExcerptsDAO implements ExcerptsDAO<Excerpt>
      

      或者你也可以这样做

      public class ExcerptDAO implements ExcerptsDAO{}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        • 2011-06-28
        • 1970-01-01
        • 1970-01-01
        • 2023-01-18
        • 1970-01-01
        • 2015-11-02
        相关资源
        最近更新 更多