我遇到了可以很好地编译的代码,但是如果使用方法引用而不是lambda,则会在运行时抛出IllegalAccessError
。
该代码涉及使用不可见的package-private类作为公共类中公共方法的参数类型。
这样的设计在将来的Java版本中应该避免吗? (或者仅仅是当前版本中的错误?(8u201))
package1 / Test.java:
package package1;
import java.util.function.Predicate;
import package2.Child;
public class Test {
public static void main(String[] args) {
Predicate<Child> p1 = x -> Child.check(x);
p1.test(new Child()); // Passes
Predicate<Child> p2 = Child::check; // <-- This line throws IAE
p2.test(new Child());
}
}
package2 / Child.java:
package package2;
class Base {
}
public class Child extends Base {
public static boolean check(Base base) {
return true;
}
}
(此代码是最少的,并且没有语义意义。)