【发布时间】:2015-11-03 14:47:31
【问题描述】:
我需要扩展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 类?
【问题讨论】:
-
@ElliottFrisch 编辑发布
B -
您需要删除所有 *.class 文件,然后重新编译。您的磁盘上仍然存在导致此问题的旧类文件。 (如果这是一个“真正的”问题,你会在编译时得到一个错误,而不是在运行时)
-
“默认”是什么意思?您是指具有包访问权限的构造函数吗?还是您的意思是默认的无参数构造函数?
-
@dantiston 具有包访问权限的构造函数
-
另一种选择是封装是密封的,在这种情况下你不能这样做,但你绝对应该首先尝试做一个干净的构建(从早期编译中删除所有旧的 .class 文件),就像我一样上面提到的。
标签: java inheritance access-control