JDK косяк?
public State getState {статический должон быть, не?
С чего бы? Если AbstractClass сделать не абстрактым, то всё работает.
Какой тип у container?
HashMap, но какое это имеет значение?
А хз, что может происходить. Ты ж не указал, в какой строчке эррор возникает.
при вызове: obj.map(NotAbstractClass::getState)
прошу прошения: Test должен быть в другом пакете, для того, чтобы воспроизвелось.
Connected to the target VM, address: '127.0.0.1:52741', transport: 'socket'
Exception in thread "main" java.lang.IllegalAccessError: tried to access class ru.example.AbstractClass from class ru.anotherpackage.Test
at ru.anotherpackage.Test.lambda$main$0(Test.java:10)
at ru.anotherpackage.Test$$Lambda$1/1989972246.apply(Unknown Source)
at java.util.Optional.map(Optional.java:215)
at ru.anotherpackage.Test.main(Test.java:10)
Disconnected from the target VM, address: '127.0.0.1:52741', transport: 'socket'
Process finished with exit code 1
Exception in thread "main" java.lang.IllegalAccessError: tried to access class ru.example.AbstractClass from class ru.anotherpackage.Testну, типа, должен быть public abstract?
System.out.println(obj.get.getString;
System.out.println(obj.map(j -> j.getString.orElse("noString";
System.out.println(obj.map(NotAbstractClass::getString).orElse("noString";
Имхо, это косяк. Оно ведь компилится без ошибок, значит считает что всё ок, просто где-то лишняя проверка выполняется.
Хм, а ты точно Test в другой пакет переложил?
этот или какой-то другой.
Моя версия компилятора генерит такой байт-код для обработчика лямды 'NotAbstractClass::getString':
(Бага в том, что этот код использует недоступный AbstractClass вместо NotAbstractClass.)
Наверное, это баг в javac, Моя версия компилятора генерит такой байт-код для обработчика лямды 'NotAbstractClass::getString':
private static java.lang.Object lambda$MR$main$getString$d528cc2d$1(java.lang.Object);
descriptor: (Ljava/lang/Object;)Ljava/lang/Object;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: checkcast class ru/example/AbstractClass
4: invokevirtual Method ru/example/AbstractClass.getStringLjava/lang/String;
7: areturn
(Бага в том, что этот код использует недоступный AbstractClass вместо NotAbstractClass.)
интересно, b47 это значит 1.8.0.47 ?
Да, 1.8.0.47.
http://www.oracle.com/technetwork/java/javase/8u51-relnotes-...
UPD:
b47 это похоже к 9ой версии относится.
Я правильно понял, что в 8ой версии они его править не собираются?
Опыт показывает, что в Java полно багов, и проще использовать какой-нибудь workaround, чем ждать фикса.
Оставить комментарий
kill-still
java.lang.IllegalAccessError: tried to access class ru.example.AbstractClass from class ru.example.TestПроверял на 1.8.0.25 и 1.8.0.45 win х64