java - 在 Java 中使用默认构造函数扩展类

标签 java inheritance access-control

我需要延长class A但它需要重写它的构造函数。

package com.example.io; // Package belongs to jar from maven dependency

public class A {
    A(String s, Integer i) {
        // constructor code
    }

    // other methods
}

由于它是默认构造函数(仅具有包访问权限的构造函数),我无法在包外部访问,因此我在源代码中创建了相同的包名称 com.example.io并扩展class A并构建成功。

package com.example.io; // Package belongs to my source code

public class B extends A{
    B(String s, Integer i) {
        super(s, i); // Throws error on runtime
    }

    // other methods
}

但它会抛出运行时错误 -

java.lang.IllegalAccessError: tried to access method com.example.io.A.<init>(Ljava/lang/String;Ljava/lang/Integer;)V from class com.example.io.B

如何解决这个问题?我的意思是,有什么方法可以使用默认构造函数扩展 A 类吗?

最佳答案

您绝对不应该只复制第 3 方库的包的名称。这可能会导致意想不到的结果。请参阅this answer .

相反,如果该类是public,则您应该创建自己的子类并定义自己的构造函数。如果父类(super class)的构造函数设置为 package,则无法调用它。在这种情况下,如果您有代码,您可以根据需要重新实现必要的构造函数操作:

public class MyClass extends A {

    String myString;
    Integer myInteger;
    String myField;

    MyClass(String s, Integer i) {
        // Can't do this because it's set to package
        // super(s, i);
        // Re-implement?
        this.myString = s;
        this.myInteger = i;
        // Implement your own stuff
        this.myField = s + String.valueOf(i);
    }
}

关于java - 在 Java 中使用默认构造函数扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33492150/

相关文章:

javascript - WebSocket 慢 - Java 和 JavaScript

c# - 当我一直调用基类方法时如何调用我的具体类方法

c++ - 如何在单链表中正确使用protected

sql - 如何通过 SQL 表进行访问控制?

php - Yii2 AccessControl 用于特定网站访问的操作

c++ - 基访问派生的 friend

java - 使用自定义注释创建我们自己的方面

java - 通过访问者评估树表达

java - 如何设置对象的 boolean 状态

C# 替代虚拟静态方法和静态子类