当前位置: 首页 > 知识库问答 >
问题:

Java:“尝试分配较弱的访问权限错误”(用1.8编译JDK 1.6源代码)

尉迟高澹
2023-03-14

使用Gradle,我们正在尝试编译遗留Java代码,这些代码是用JDK1.8编译器为JDK1.6开发的。在某个时刻,编译过程会以错误的方式退出

试图分配较弱的访问权限;是公开的

(错误本身的原因很明显:我们在一个抽象类中有一个方法,它被声明为public,但实现类却将其声明为protected。)

目前,重构整个产品代码(预计会出现更多类似的错误)不是一个选项,因此我们正在寻找一个用新的JDK构建旧代码的解决方案。

有什么能帮上忙的吗?

共有1个答案

史鹏云
2023-03-14

对于您的系统过去使用Java1.6这一事实的唯一解释是,超类中的方法访问被更改为public而没有重新编译子类。从一开始就禁止降低子类中的可访问性。

Java语言规范1.6在第344页提供了这样的解释:

如果包点定义了类点:

package points;
public class Point {
    public int x, y;
    protected void print() {
        System.out.println("(" + x + "," + y + ")");
    }
}
class Test extends points.Point {
    protected void print() {
        System.out.println("Test");
    }
    public static void main(String[] args) {
        Test t = new Test();
        t.print();
    }
}

然后这些类编译并测试执行以产生输出:

Test

如果将类point中的方法print更改为public,然后只重新编译point类,然后使用test的先前存在的二进制文件执行,那么不会发生链接错误,即使在编译时不适合由受保护的方法重写公共方法(如以下事实所示,除非将print更改为public,否则无法使用此新的point类重新编译test类。)(着重部分后加)

如果必须使用Java1.8编译器重新创建确切的行为,请将超类中的可访问性更改为protected,编译超类和子类,然后将超类中的可访问性更改为public,并只编译超类。但是,在这一点上,我强烈建议更改子类以提供适当的可访问性。

 类似资料:
  • 使用Gradle,我们尝试编译遗留的Java代码,它是使用JDK 1.8编译器为JDK 1.6开发的。在某个时候,编译过程会因错误而退出 试图分配较弱的访问权限;是公开的 (错误本身的原因很明显:我们在抽象类中有一个方法,它被声明为public,但实现类将其声明为protected。) 使用JDK 1.6进行编译,我们从未遇到过任何问题。现在,出于几个原因,我们必须用Java 8编译代码,让我们遇

  • 本文向大家介绍解决Java提示正在尝试分配更低的访问权限问题,包括了解决Java提示正在尝试分配更低的访问权限问题的使用技巧和注意事项,需要的朋友参考一下 正在尝试分配更低的访问权限?在进行Java编程时会给我们报出如下提示怎么办?这里我们将给大家介绍详细的解决方法。 首先,查看,控制台给出的提示:正在尝试分配更低的访问权限,以前为public 找到提示所在行,如案例的所示的行。在该行中,发现vo

  • 我的系统中有以下配置: Apache Maven 3.5.2 Maven主页: /usr/share/mavenJava版本:1.8.0_162,供应商:Oracle CorporationJava主页: /usr/lib/jvm/java-8-openjdk-amd64/jre默认语言环境:en_US,平台编码:UTF-8操作系统名称:"linux",版本:"4.15.0-20-通用", arc

  • 当我尝试注册以下代码时,会出现此错误:code 下图中出错

  • 本文向大家介绍Java编程访问权限的控制代码详解,包括了Java编程访问权限的控制代码详解的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是Java编程访问权限的控制的相关内容,具体介绍如下。 之前没去注意的修饰符,一般变量前面没添加,一个是不知道有什么用,一个是懒,后面遇到项目的时候就会发现私有和公有区别还是很大的。 (1)首先是包名 使用一个类的时候,例如集合类,就需要引入这个包,然后

  • 我想知道,当异常发生时,try with resource语句如何在进入catch块之前关闭资源。当异常发生时,执行立即跳转到catch块。因此,try-with-resource实际上关闭了资源。 为了更好地理解它的工作原理,我决定看看编译器是如何实现它的。我编写了下面的代码并对其进行了编译。 输出 然后我访问了www.javadecompilers.com,并在那里试用了反编译程序。两个反编译