java - 覆盖类泛型类型

标签 java oop generics

我有这个界面:

interface Entity<PK> {
    PK getPk();
    void setPk(PK pk);
}

我这样重写:

class User implements Entity<User.PK> {
    PK pk;

    @Override
    public PK getPk() { return pk; }

    @Override
    public void setPk(PK pk) { this.pk = pk; }

    // Composed primary key
    class PK {
        String id;
        String email;
    }
}

但是,如果我必须扩展 User 类来扩展泛型类型 User.PK,我就不能这样做,因为 UserEntity 类型的 setPk(UserEntity.PK) 方法必须重写或实现父类(super class)型方法

class UserEntity extends User {
    PK pk;

    @Override
    public PK getPk() { return pk; }

    @Override
    public void setPk(PK pk) { this.pk = pk; }

    class PK extends User.PK implements Serializable {
        String id;
        String email;
    }
}

那么如何为给定的泛型类型创建一个接口(interface),同时又能扩展实现它的类呢?

最佳答案

我建议这个解决方案:

  1. 您的interface Entity<PK>看起来不错
  2. 摘录class PK定义到名为 UserPk 的单独文件中
  3. 稍微重新定义User像这样
class User<PK> implements Entity<PK> {
    private PK pk;

    @Override
    public PK getPk() { return pk; }

    @Override
    public void setPk(PK pk) { this.pk = pk; }  
}

稍后使用它,例如 new User<UserPk>()

  • 也放入单独的类(class)
  • class UserEntityPk extends UserPk implements Serializable {
            String id;
            String email;
    }
    
  • 重复使用class User<PK>以这种方式使用新的关键参数 new User<UserEntityPk>()
  • 关键思想是将参数化类与键的定义分开,以简化架构。

    顺便说一句,只是好奇你们的键定义之间有什么区别?他们俩都有相同的idemail字符串。所以看起来你不需要 class PK extends User.PK implements Serializable完全没有。

    关于java - 覆盖类泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58645520/

    相关文章:

    java - 如何将对象替换或删除为数组中的非空值

    java - 如何在Java应用程序中处理多种语言?

    java - DroidAR Marker 演示不工作

    python - 如何验证 namedtuple 值?

    javascript - 为什么我的方法没有返回对象

    java - 如何不允许类型推断并要求方法调用时显式类型?

    java - ArrayList<> 与 ArrayList<Integer>

    swift - 快速实现泛型方法

    java - 在 Java 中返回通用对象(例如列表)的更清洁的解决方案

    php - 这个方法属于哪个类?