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

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

盖夕
2023-03-14

使用Gradle,我们尝试编译遗留的Java代码,它是使用JDK 1.8编译器为JDK 1.6开发的。在某个时候,编译过程会因错误而退出

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

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

使用JDK 1.6进行编译,我们从未遇到过任何问题。现在,出于几个原因,我们必须用Java 8编译代码,让我们遇到这个问题。

我们已经在构建时尝试了项目设置,但没有效果。

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

有什么帮助吗?

共有1个答案

尉迟正平
2023-03-14

对于系统使用Java 1.6这一事实的唯一解释是,超类中的方法访问已更改为公共,而无需重新编译子类。从一开始就禁止降低子类中的可访问性。

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

如果classPoint中的方法print更改为public,然后仅重新编译Point类,然后使用先前存在的二进制文件执行Test,则在编译时不会发生链接错误,即使它不正确,对于要由受保护的方法重写的公共方法(如无法使用此新的点类重新编译类测试,除非将打印更改为公共)(增加强调)

如果必须使用Java 1.8编译器重新创建确切的行为,请将超类中的可访问性更改为受保护的,编译超类和子类,然后将超类中的可访问性更改回公共,并仅编译超类。然而,在这一点上,我强烈建议更改子类以提供适当的可访问性。

 类似资料:
  • 使用Gradle,我们正在尝试编译遗留Java代码,这些代码是用JDK1.8编译器为JDK1.6开发的。在某个时刻,编译过程会以错误的方式退出 试图分配较弱的访问权限;是公开的 (错误本身的原因很明显:我们在一个抽象类中有一个方法,它被声明为public,但实现类却将其声明为protected。) 目前,重构整个产品代码(预计会出现更多类似的错误)不是一个选项,因此我们正在寻找一个用新的JDK构建

  • 我的系统中有以下配置: 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

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

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

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

  • 我得到: 错误:(37,30)Java:无法访问未找到java.util.function.function的java.util.function.function类文件 指向“等待”