LINUX.ORG.RU

[java][г]Маразматические глюки.


0

0

Есть простенький код:

import java.util.Arrays;
import java.util.List;
public class Main {
    public static void main(String[] args) {
      Container cont0 = new Container();
      for(String s : cont0.getStrings()){
        System.out.println(s);
      }
    }
}
class Container<T> {
  public T getType(){
    return null;
  }
  public List<String> getStrings(){
    return Arrays.asList("1", "2", "str");
  }
}

Компилируем.... и получаем

Main.java:6: incompatible types
found   : java.lang.Object
required: java.lang.String
      for(String s : cont0.getStrings()){
                                     ^
1 error

Это не бага, а фишка, только как эти **** которые такие фишки придумали объяснят свои затейства (в багтреккере наверняка это есть но непонятно как найти)?

ps. Пойти что ли в церковь микрософта и поставить черную свечку за тех кто реализовал генерики в яве?

★★☆

прихожане майкрософтовской церкви смотрят на

Container cont0 = new Container(); 
с нескрываемым ужасом.

k0l0b0k ★★ ()
Ответ на: комментарий от k0l0b0k

Я рад что заставил хоть когото жидко обкакаться.

wfrr ★★☆ ()
Ответ на: комментарий от k0l0b0k

Не тут за явапрограммистами столкьо говна остается когда они узнают очередную фишку™ энтрепрайз езыка.

wfrr ★★☆ ()

кто призывал к пинанию индусов

      List<String> ls = cont0.getStrings();
      for(String s : ls){

и всё работает.

P.S. да с т.з. языка неработа твоего варианта не логична

qnikst ★★★★★ ()

IDEA ругнулась, переписал как for(Object s : cont0.getStrings()){ все нормально выполнилось

Karapuz ★★★★★ ()

И вот так Container<String> cont0 = new Container();
for(String s : cont0.getStrings()){

работает

Karapuz ★★★★★ ()
Ответ на: комментарий от Karapuz

1) язык должен быть логичным, так чтоб ошибки можно было найти и без ide до компилятора

2) Вы работаете школьником?

wfrr ★★☆ ()
Ответ на: комментарий от Karapuz

Уважаемый, оно дохрена как работает, вопрос почему оно так как в примере не работает.

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

Зачем делать class Container<T> {

если потом не использовать <T>: Container cont0 = new Container();
?

Karapuz ★★★★★ ()

Container<?> cont0 = new Container<Object>(); for(String s : cont0.getStrings()){ System.out.println(s); }

так работает. Зачем вообще в 21 веке использовать raw типы?

Legioner ★★★★★ ()
Ответ на: комментарий от wfrr

Очевидно же. Если ты не указываешь никаких параметров, включается знаменитый режим совместимости со старым кодом (в том числе и на уровне байткода), и отключаются все фишки генериков. Хочешь генерики - используй их. Не хочешь - пиши в старом стиле.

Legioner ★★★★★ ()
Ответ на: комментарий от qnikst

Перефразирую вопрос - вам платят за лишнюю строчку кода?

wfrr ★★☆ ()
Ответ на: комментарий от Legioner

включается знаменитый режим совместимости со старым кодом (в том числе и на уровне байткода)

Знаменитый режим включен по умолчанию, уважаемый, ежели загляните в спеки то узнаете, что в байткоде _нет_ никаких различий, там тупо кастуются значения.

фишки генериков.

man Type Erasure™ у гененириков в яве нет фишек.

wfrr ★★☆ ()
Ответ на: комментарий от Legioner

Почему никто не посоветовал лисп?

ведь на лоре принято вместо ответа на вопрос советовать сменить яп, религию, пол, отправится на тот свет.

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

иногда бывает гораздо удобнее отлаживать программу, в которой есть такие «лишние» строки, тем более, что они не ухудшают читабильность и писать их не многим дольше.

qnikst ★★★★★ ()
Ответ на: комментарий от wfrr

> man Type Erasure™ у гененириков в яве нет фишек.

это модно в теме где задаешь вопрос давать на него добрую половину ответа?

qnikst ★★★★★ ()
Ответ на: комментарий от qnikst

> где задаешь вопрос давать

А это и не б\было вопросом.

tailgunner ★★★★★ ()
Ответ на: комментарий от qnikst

Таки плотят, значить. Уважаемый, просто какбы ежели вы сказали «а» про индусокод, то не зевайте говорите и «б», а то вы както внезапно поджамши свою точку зрения бросили распейсывать как удобно отлаживать.

wfrr ★★☆ ()
Ответ на: комментарий от qnikst

Я вам процитирую свой вопрос, хорошо?

как эти **** которые такие фишки придумали объяснят свои затейства?

как видите тут нет вопроса про то кок оно работает или ка оно сделано, тут лишь вопрос как они оправдывают свои маразматические идеи. Хотя даже на этот вопрос у меня есть предположения.

wfrr ★★☆ ()

Товарищ Выферр, вместо Container cont0 = new Container(); напишите Container<?> cont0 = new Container(); и будет вам счастье. В оригинальном варианте вы, товарищь Выферр, декларировали полное неиспользование генериков для cont0. К следующему уроку выучите и расскажите всему классу про raw types.

bbk123 ★★★★★ ()
Ответ на: комментарий от tailgunner

внимательнее читаем, там аж 2 вопроса про свечку девелоперам и про как объяснят. И кусок «нерабочего» кода, который исправляется сразу же.

qnikst ★★★★★ ()
Ответ на: комментарий от wfrr

индусокод был «стандартной» добавкой в общем-то на том, что вначале приведён индусокод настаивать не буду.

А просто выписыванием переменной как она должна быть всё решилось, проблем у компилятора не возникло + бесплатный бонус удобство отладки.

ещё вопросы?

qnikst ★★★★★ ()
Ответ на: комментарий от bbk123

К следующему уроку выучите и расскажите всему классу про raw types




ЖЖЖЖЖЖЖЖОШЬ

Karapuz ★★★★★ ()
Ответ на: комментарий от bbk123

Не перевелись еще на земле Русской иванюшки дурачки.

wfrr ★★☆ ()
Ответ на: комментарий от qnikst

Уважаемый, совместимость там есть и так, они ей оправдывают убогость генериков (кстати, просьба убрать это один из самый популярный реквестов в багтреккере жабы), а, как вы сами заметили, нелогичное поведение? Ведь совместимость вполне логично работает: не указали тип - получили Object, но вы сами видели тип указан, или не видели? 8)

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

это типа клёво сказать, тоже самое что и я?

убогость потому, что решили сохранить совместимость, решили бы не сохранять вероятно не было бы этой убогости.

как уже выше писали «Container<?> cont0 = new Container<Object>();» и всё работает.

qnikst ★★★★★ ()
Ответ на: комментарий от qnikst

> внимательнее читаем, там аж 2 вопроса про свечку девелоперам и про как объяснят

Там два ответа, но нет вопроса. Впрочем, если ты считаешь это вопросом:

только как эти **** которые такие фишки придумали объяснят свои затейства (в багтреккере наверняка это есть но непонятно как найти)?

то you must be new here.

tailgunner ★★★★★ ()
Ответ на: комментарий от qnikst

это типа клёво сказать, тоже самое что и я?

Перечитайте ваш пост и мой и попробуйте подумать. Если не получится то дают подсказку - глюки не оправдываются совместимостью.

и всё работает.

Сколько раз вам, бедному, можно повторять, что случаи когда оно работает меня не интересуют?

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

Судя по этому сообщению вы, товарищь Выферр, очень самокритичны. Действительно, не перевелись на земле русской белочки дурачки.

bbk123 ★★★★★ ()
Ответ на: комментарий от wfrr

> Если не получится то дают подсказку - глюки не оправдываются совместимостью.

данный да.

Сколько раз вам, бедному, можно повторять, что случаи когда оно работает меня не интересуют?

\infty

qnikst ★★★★★ ()

интересное место, что бы пободаться с ветряными мельницами.

зы. пентакс — гавно.

Rastafarra ★★★ ()
Ответ на: комментарий от bbk123

Постарайтесь, когда пойдете в первый класс, бросить ваши детсадовские привычки.

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

Товарищ Выферр, начинайте думать головой, а не защёчными мешками с орехами. На ваш вопрос тут уже ответили, причём многократно. Старые библиотеки, написанные до Java 5.0, ничего о генериках не знают. Поэтому они не могут гарантировать безопасное использование и приведение типов в дальнейшем, когда такие библиотеки используются в коде с генериками. Для таких случаев были введены raw types, которые объявляют данную переменную небезопасной и отключают для неё все неявные проверки и приведения типов (то, чем занимаются генерики). Пользоваться такими переменными нужно так же, как если бы вы продолжали писать код для Java 1.4.2. Это означает, что проверки и приведения типов вы должны делать сами. Если весь код пишется для Java 5.0 или выше, то не выпендривайтесь и не используйте raw types.

bbk123 ★★★★★ ()
Ответ на: комментарий от bbk123

Вы, уважаемыЙ, слишком умны чтобы понять очевидную вещь, тут все только и занимаются что объясняют вам и прочим интеллектуалам, в чем заключался вопрос, а до вашей костной коры головной пустоты все никак не дойдет.

отключают для неё все неявные проверки и приведения типов

Вы написали бред, уважаемый, тип явно указывается, это раз, два: на самом деле приведение типов подставляет компилятор (повторяю для тупых - бинарный код совместим). И три, это не ответ на вопрос.

Теперь, уважаемый первокласничек, прочитайте топик еще раз 8)

wfrr ★★☆ ()
Ответ на: Советую от ist76

Re: Советую

>Купи Никон

яростно плюсую :)

shty ★★★★★ ()

java-атцы затроллили белку :) редкий кадр

shty ★★★★★ ()
Ответ на: комментарий от shty

Буду всем советовать mono

нефиг трахать мозги людям этой нелогичной явой

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

> > отключают для неё все неявные проверки и приведения типов

Вы написали бред, уважаемый, тип явно указывается, это раз,


Он указан лишь для случаев, когда генерики вообще применимы.

два: на самом деле приведение типов подставляет компилятор (повторяю для тупых - бинарный код совместим).


Пушистый, вы страдаете дислексией в тяжёлой форме. Неяное приведение типов (то, что подставляет компилятор) - это результат работы генериков. Я об этом говорил выше. Как только вы объявили cont0 как raw type от Container<T> вы сказали компилятору примерно следующее: «я Выферр не знаю откуда я получу ссылку на Container. поэтому считаю важным сообщить, что обращаться с cont0 следует так же, как в Java 1.4.2». Если метод List<String> getStrings() сделать статическим, это заявление распространяться на него не будет. Если статическим он быть не может, то не выпендривайтесь... ну дальше вы знаете.

И три, это не ответ на вопрос.


Это не ответ на вопрос для страдающего ФГМ.

bbk123 ★★★★★ ()
Ответ на: комментарий от bbk123

Он указан лишь для случаев, когда генерики вообще применимы.

вы страдаете амозглием. изучите сигнатуру метода, уважаемый.

Неяное приведение типов (то, что подставляет компилятор) - это результат работы генериков.

Уважаемый, у вас в голове каша. Изучите соответствующую литературу.

Как только вы объявили cont0 как raw type от Container<T> вы сказали компилятору примерно следующее: «я Выферр не знаю откуда я получу ссылку на Container. поэтому считаю важным сообщить, что обращаться с cont0 следует так же, как в Java 1.4.2».

Фигасе, вы разговариваете с компилятром. А толчку вы не приказываете поглотить результат ваших умственных потуг? Изучите таки спецификацию, и не смешите меня вашими домыслами.

wfrr ★★☆ ()
Ответ на: Буду всем советовать mono от wfrr

Re: Буду всем советовать mono

нефиг трахать мозги людям этой нелогичной явой

об этом надо было думать до создания поста :)

shty ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.