powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / хех, нашли любопытную багофичу :)
12 сообщений из 12, страница 1 из 1
хех, нашли любопытную багофичу :)
    #39090194
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашли тут следующую багофичу

Код: java
1.
2.
3.
4.
5.
6.
7.
        Map map = new TreeMap();
        Set<Map.Entry> se= map.entrySet();
        for(Map.Entry e:se){ //так компилит
        }

        for(Map.Entry e : map.entrySet() ){ //так не компилит
        }
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090215
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chabapok,

чо пишет?
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090216
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javac -version
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090217
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

Это не бага. Ты во 2й строке сделал явное приведение типа.
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090347
golovonometr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

как написали выше, приведение типов. Что-то мне подсказывает, что этот код скомпилится без проблем:

Код: java
1.
2.
3.
4.
5.
6.
7.
        Map map = new TreeMap();
        Set<Map.Entry> se= map.entrySet();
        for(Map.Entry e:se){ //так компилит
        }

        for(Map.Entry e : (Set<Map.Entry>)map.entrySet() ){ // ?
        }
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090361
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы заглянул в байткод. Обычно дженерик не генерирует ничего полезного с точки
зрения JVM. Он только усиливает проверки в фазе компилляции исходного кода.
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090402
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ-бы заглянул в байткод.
Чет ты рано для пятницы. Ошибка в компиляции. Нафига байткод?
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090414
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczmaytonЯ-бы заглянул в байткод.
Чет ты рано для пятницы. Ошибка в компиляции. Нафига байткод?
Чтобы сравнить два for-a. После успешной компилляции.
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090533
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonjavac -versionchabapok@chabapok-xubuntu:/tmp/1$ /usr/local/jdk1.8.0_60/bin/javac -version
javac 1.8.0_60

Вечер четверга - это фактически пятница, так что все ок :) А в байткод можно смотреть, только если у нас что-то накомпилилось.

golovonometrchabapok,
как написали выше, приведение типов. Что-то мне подсказывает, что этот код скомпилится без проблем:

Код: java
1.
2.
         for(Map.Entry e : (Set<Map.Entry>)map.entrySet() ){ // ?
        }



Да, так компилит.

А что такое страшное возвращает наш map.entrySet(), что оно не хочет видеть в нем Set<Map.Entry> ? Компилятор ругается так:
Test1.java:18: error: incompatible types: Object cannot be converted to Entry
То есть похоже, что ему кажется, что возвращается Set<Object> - но почему ему так кажется?

Есличо, сигнатура метода такая:

Код: java
1.
Set<Map.Entry<K, V>> entrySet();



На этапе выполнения наш сет будет состоять из Object-ов, но ведь на этапе компиляции тип, которым сет параметризирован, должен быть известен? K и V у нас не заданы - значит Object. Или нет? но даже вот так не компилит:

Код: java
1.
for(Map.Entry<Object, Object> e : map.entrySet() ){     }



Но в то же время, вот это компилится:
Код: java
1.
2.
3.
        Map<Object, Object> map = new TreeMap();
        for(Map.Entry e : map.entrySet() ){ 
        }



странно.
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090582
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class MyObject<T>

public MyObject(List<T> values) {        
        this.values = values;        
    }    

//...

new MyObject(Collections.<String>emptyList());
new MyObject(Collections.emptyList());
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39090586
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokЕсличо, сигнатура метода такая:
Код: java
1.
Set<Map.Entry<K, V>> entrySet();




Вот здесь ошибка. Это если тип параметризован (Map<?, ?>), сигнатура такая. А вот у непараметризованного (raw type, Map) сигнатура будет
Код: java
1.
Set entrySet();



Читайте JLS Chapter 4.8 Raw Types. Если generic'и не используются, то они не используются везде а не только в объявлениях методов.
...
Рейтинг: 0 / 0
хех, нашли любопытную багофичу :)
    #39091084
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxkar,

Ясненько, спасибо.
Ушел читать jls...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / хех, нашли любопытную багофичу :)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]