|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
Всем привет! Наткнулся на такой фокус покус. есть два класса - предок и потомок (в РАЗНЫХ ПАКЕТАХ, это важно): Код: java 1. 2. 3. 4. 5.
Код: java 1. 2. 3. 4. 5. 6. 7. 8.
запускаем тест: Код: java 1.
получаем исключение: java.lang.BootstrapMethodError: java.lang.IllegalAccessError: tried to access method com.p.Parent.getString()Ljava/lang/String; from class com.Child$Value хмм.., теперь следим за руками, меняем method reference Код: java 1.
на lambda Код: java 1.
т.е. получается Код: java 1. 2. 3. 4. 5. 6. 7. 8.
запускаем тест - все работает! выходит method reference и lambda не совсем одно и то же? печалька.. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 00:57 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
Поправил ваш пример до компилируемого состояния (все три класса - в разных пакетах): Parent.java Код: java 1. 2. 3. 4. 5. 6.
Child.java Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Main.java Код: java 1. 2. 3. 4. 5. 6.
Код: plaintext 1. 2. 3. 4. 5. 6.
Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 07:58 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, спасибо! так у вас воспроизвелось? если именно не с лямбдой, а с method reference? Я такой нюанс уже второй раз наблюдаю, первый раз было несколько лет назад, на другом примере. Как это происходит, видишь такой в коде лямбду, IDEA предлагает заменить на reference. Ну и ты такой меняешь, что такого. А ошибка потом в runtime происходит, ты даже об этом узнать можешь намного позже. Сейчас мне юнит тесты помогли, так что я сразу заметил. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 12:26 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
По моему, тексты классов достаточно короткие, чтобы понять: нет, не воспроизвелось. Ну или ткнуть пальцев те места кода, которые отличаются от вашей задумки. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 12:32 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, сейчас только заметил, вы заменили внутренний класс Value на метод Value. Вот поправленные примеры: Parent.java Код: java 1. 2. 3. 4. 5. 6.
Child.java Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Main Код: java 1. 2. 3. 4. 5. 6.
должно свалиться на Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 15:50 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
ну а если method reference заменить на lambda - то все рабоатет ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 15:51 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
rabiter выходит method reference и lambda не совсем одно и то же? Нет, не одно и то же ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 16:21 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
Псевдомизантроп, да, похоже на то. Лямбда понятно - создает анонимную имплементацию интерфейса, в принципе, ничего нового, просто синтаксис. А я наивный думал method reference тоже так же имплементирован. Походу нет. И самая подстава, что такая ошибка-то runtime а не compile. А IDEA такая: не хочешь немного method reference вместо лямбд?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 16:57 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
Бага(?) javac JVM8: чуть подрезал комстроку javac JVM11 Код: plaintext
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
P.S. Реализация лямбд отдаётся "на откуп" разработчикам JDK/JVM: могут сделать так, могут - сяк. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 18:53 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Бага(?) javac JVM8: чуть подрезал комстроку javac JVM11 Код: plaintext
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
P.S. Реализация лямбд отдаётся "на откуп" разработчикам JDK/JVM: могут сделать так, могут - сяк. ну может быть и бага в JVM... у меня тоже восьмерка, не проверял на других версиях Код: plaintext 1. 2. 3.
может выложу баг, куда бы написать только, надо погуглить) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 23:08 |
|
Забавное поведение method reference
|
|||
---|---|---|---|
#18+
Тестовый пример, если вы не заметили, успешно запустился под Java 8. Байткод создавал javac из jdk11, но с -target 8. Следовательно, проблема не в вашем примере и не в JVM Java 8, а в javac jdk8. Замечу, что есть ещё и ecj и OpenJ9, но мне уже в ломы ковырять дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2021, 08:26 |
|
|
start [/forum/topic.php?fid=59&msg=40050373&tid=2120513]: |
0ms |
get settings: |
26ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
242ms |
get tp. blocked users: |
2ms |
others: | 283ms |
total: | 630ms |
0 / 0 |