Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / хех, нашли любопытную багофичу :) / 12 сообщений из 12, страница 1 из 1
29.10.2015, 15:26
    #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
29.10.2015, 15:42
    #39090215
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хех, нашли любопытную багофичу :)
chabapok,

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

Это не бага. Ты во 2й строке сделал явное приведение типа.
...
Рейтинг: 0 / 0
29.10.2015, 17:17
    #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
29.10.2015, 17:27
    #39090361
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хех, нашли любопытную багофичу :)
Я-бы заглянул в байткод. Обычно дженерик не генерирует ничего полезного с точки
зрения JVM. Он только усиливает проверки в фазе компилляции исходного кода.
...
Рейтинг: 0 / 0
29.10.2015, 17:56
    #39090402
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хех, нашли любопытную багофичу :)
maytonЯ-бы заглянул в байткод.
Чет ты рано для пятницы. Ошибка в компиляции. Нафига байткод?
...
Рейтинг: 0 / 0
29.10.2015, 18:07
    #39090414
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хех, нашли любопытную багофичу :)
BlazkowiczmaytonЯ-бы заглянул в байткод.
Чет ты рано для пятницы. Ошибка в компиляции. Нафига байткод?
Чтобы сравнить два for-a. После успешной компилляции.
...
Рейтинг: 0 / 0
29.10.2015, 20:33
    #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
29.10.2015, 21:51
    #39090582
rdm
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
29.10.2015, 21:58
    #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
30.10.2015, 13:39
    #39091084
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хех, нашли любопытную багофичу :)
maxkar,

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


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