覆盖类的通用类型

问题描述 投票:0回答:1

我有这个界面:

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,则不能因为the method setPk(UserEntity.PK) of type UserEntity must override or implement a supertype method

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;
    }
}

所以我如何为给定的泛型类型创建接口,但能够扩展实现该接口的类?

java oop generics
1个回答
0
投票

我将建议此解决方案:

  1. 您的interface Entity<PK>看起来不错
  2. class PK定义提取到名称为UserPk的单独文件中>
  3. 像这样稍微重新定义User
  4. 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>()一样使用它

  1. 也放入单独的类中
  2. class UserEntityPk extends UserPk implements Serializable {
            String id;
            String email;
    }
    
  1. 以这种方式与新的密钥参数class User<PK>一起使用new User<UserEntityPk>()
  2. 关键思想是将参数化的类与键的定义分开。

© www.soinside.com 2019 - 2024. All rights reserved.