【问题标题】:Can't compile sub class that implements abstract method from base class无法编译从基类实现抽象方法的子类
【发布时间】:2016-08-21 20:44:50
【问题描述】:

在编译我定义的具有单个方法的基类的子类时遇到问题,并且每个子类都实现了抽象基方法,但是 javac 说它们没有,即使它在子类。

DbModel.java(基类)

package com.manodestra.db;

import java.sql.ResultSet;
import java.sql.SQLException;

public abstract class DbModel<T extends DbModel> extends Model {
    abstract T newInstance(ResultSet rs) throws SQLException;
}

DbModel 扩展了 Model,它只有一个通用的 toString 方法。

MenuPermissions.java(子类)

package com.manodestra.csa.db.model.configNew;

import com.manodestra.db.DbModel;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;

public class MenuPermissions extends DbModel<MenuPermissions> {
    private final String menuId;
    private final String userLevel;

    public MenuPermissions(
        String menuId,
        String userLevel
    ) {
        this.menuId = menuId;
        this.userLevel = userLevel;
    }

    public String getMenuId() {
        return this.menuId;
    }

    public String getUserLevel() {
        return this.userLevel;
    }

    public MenuPermissions newInstance(ResultSet rs) throws SQLException {
        return new MenuPermissions(
            rs.getString("menu_id"),
            rs.getString("user_level")
        );
    }
}

编译错误

[javac] Compiling 487 source files to C:\Media\Code\manodestra_java\bin
[javac] C:\Media\Code\manodestra_java\src\com\manodestra\csa\db\model\configNew\MenuPermissions.java:10:
error: MenuPermissions is not abstract 
and does not override abstract method newInstance(ResultSet) in DbModel
[javac] public class MenuPermissions extends DbModel<MenuPermissions> {
[javac]        ^

有人看到这里有什么问题吗?我猜我忽略了一些非常简单的事情。

有关要求的更多信息:

我正在构建一个从给定数据库生成模型对象的实体框架。上面的 MenuPermissions 就是一个这样的模型对象(由我编写的名为 GenerateModel 的类自动生成)。我希望每个模型都有一个方法,该方法允许我根据结果集获取每个对象类型的新实例,该实例将相应地填充对象并返回它。理想情况下,它应该是一个静态方法,但我暂时将它作为一种具体方法进行了尝试,因为我需要强制它存在于 DbModel 的每个子类中。希望这是有道理的。

【问题讨论】:

  • 你的抽象方法有包访问权限,我不知道这是不是有意的
  • @Laser 是的...将其发布为答案。竖起大拇指。
  • 覆盖时可以扩大访问级别:Ideone
  • 缺少@Override 注释?
  • 当您使用实例方法 MenuPermissions.newInstance 实例化实例本身时,我可以闻到另一个错误。

标签: java


【解决方案1】:

您的抽象方法newInstance 具有包访问权限。我不知道这是否是有意的,但如果它在不同的包中,那么你会得到一个错误。

编辑:

因此父类中的抽象方法无法解析,因为它没有声明为public。一种可能的补救方法是在方法定义中添加public 或将子类移动到与父类相同的包中:-D

【讨论】:

  • 你能详细说明如何纠正这个问题吗?我需要生成的类在不同的包中。我试过将它们放在同一个包中,效果很好,但这对我没有好处。
  • @ManoDestra 简单来说,就是把抽象方法做成protected
  • 啊,明白了。愚蠢的小学生错误。将其公开修复它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多