【问题标题】:Cannot implement abstract class from other package无法从其他包实现抽象类
【发布时间】:2012-05-29 12:30:21
【问题描述】:

由于某种原因,我似乎无法在定义它的包之外实现抽象类。 package1 中的抽象类不能在 package2 中的类中实现。为什么这不是合法的 Java?

package com.stackoverflow.abstraction.package1;

abstract public class BaseClass {
    abstract Long foo();
}

package com.stackoverflow.abstraction.package1;

public class Implement1 extends BaseClass {
    @Override
    Long foo() {
        return null;
    }
}


package com.stackoverflow.abstraction.package2;

import com.stackoverflow.abstraction.package1.BaseClass;

/** Compiling this class will output
* - Implement2 is not abstract and does not override abstract method foo() in BaseClass
* - error: method does not override or implement a method from a supertype
*/

public class Implement2 extends BaseClass {
    @Override
    Long foo() {
        return null;
    }
}

运行: OS X 10.6.8 - Java(TM) SE 运行时环境 (build 1.6.0_31-b04-415-10M3646) - OpenJDK 运行时环境 (build 1.7.0-u4-b13-20120301) 尝试了两个 Java 版本。当然不是同时 :)

【问题讨论】:

    标签: java abstract-class


    【解决方案1】:

    该方法是包级别的可见性,因此您不能在其他包中覆盖它。

    abstract Long foo();
    

    如果方法没有修饰符(默认,也称为 package-private),它只在自己的包中可见

    如果您确实需要覆盖它,请将其改为protected

    protected abstract Long foo();
    

    信息

    【讨论】:

    • 谢谢,添加了一些信息以澄清您的答案。虽然并不完全清楚,但我得到了我需要的一点信息,希望它对其他人也有意义:)
    【解决方案2】:

    您的两个foo 方法具有默认的“包”访问权限。您的 Implementation2 类甚至无法调用该方法 - 所以能够覆盖它没有多大意义。

    不清楚您希望他们拥有什么级别的访问权限,但最简单的方法可能是让他们都公开。目前,您是说只有package1 中的调用者可以调用BaseClass.foo(),但只有package2 中的调用者可以调用Implement2.foo()。这显然没有多大意义。您希望谁能够访问该方法?如果您只希望类或子类中的调用者能够调用它,则将其设为 protected - 否则将其设为 public

    有关访问修饰符的更多详细信息,请参阅section 6.6 of the Java Language Specification(和Java tutorial)。特别是在经历了各种访问修饰符之后:

    否则,我们说有默认访问,只有当访问发生在声明类型的包内时才被允许。

    【讨论】:

    • 您肯定很快就会扩展您的答案。有趣的是,它是如何从一行演变而来的 :)
    • @oligofren:我不认为这个特定的行是单行的,但是是的 - 我从最基本的开始,然后添加更多上下文、建议、链接等。
    【解决方案3】:

    您有四个访问修改器:
    - 公共 - 您可以在任何地方使用它
    - 私有的 - 你只能在类中使用它
    - 受保护 - 您只能在类和继承它的类中使用
    - 包访问(默认,无修饰符) - 您只能在类所属的包中使用它

    在这种情况下,您没有修饰符,这通常被视为包访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 2021-04-03
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多