代码之家  ›  专栏  ›  技术社区  ›  i_know_what

以基类作为参数重写错误的方法

  •  0
  • i_know_what  · 技术社区  · 2 年前

    我有以下代码:

    interface Entity {
        
    }
    class Student implements Entity{
        
    }
    class Course implements Entity{
        
    }
    
    interface BaseRepository {
        public void save(Entity entiy);
    }
    
    class StudentRepository implements BaseRepository {
        @Override
        public void save(Student student) {
            // student validation code
            // save the entity
        }
    }
    class CourseRepository implements BaseRepository {
        @Override
        public void save(Course course) {
            // course validation code
            // save the entity
        }
    }
    

    当我试图编译它时,会出现以下错误: StudentRepository is not abstract and does not override abstract method save(Entity) in BaseRepository

    java不接受“基类”作为参数吗?原因是什么? 有没有其他方法来编写代码?

    2 回复  |  直到 2 年前
        1
  •  1
  •   Rob Spoor    2 年前

    重写方法必须:

    • 同名
    • 具有完全相同的参数类型;子类型不起作用!
    • 具有相同或更广泛的可见性(因此受保护->公共是允许的,受保护->私人是不允许的)
    • 具有相同的返回类型或子类型

    你违反了第二条规则。幸运的是,您可以使用泛型来解决这个问题:

    interface BaseRepository<E extends Entity> {
        public void save(E entiy);
    }
    
    class StudentRepository implements BaseRepository<Student> {
        @Override
        public void save(Student student) {
            // student validation code
            // save the entity
        }
    }
    class CourseRepository implements BaseRepository<Course> {
        @Override
        public void save(Course course) {
            // course validation code
            // save the entity
        }
    

    }

    现在,一个 BaseRepository<Student> public void save(Entity) 但是 public void save(Student) .类似地 BaseRepository<Course> 应该覆盖不是吗 公共作废保存(实体) 但是 public void save(Course) .