Core Java

  Вопрос: Восходящее преобразование и generic

29

Давеча на собеседовании был озвучен вопрос:

Можно ли при определении generic коллекции указать типом переменной коллекцию класса-предка, а проинициализировать ее как коллекцию класса-потомка?

Т.е. можно ли сделать так:

Поскольку собеседование было устным, а ранее я не задавался вопросом о возможности такого подхода, я пошел методом аналогий. Восходящее преобразование возможно? Возможно:

Заполнить generic-коллекцию класса-предка объектами класса-потомка таким образом вручную возможно? Возможно:

Не видя никаких преград на пути разработчиков Java, я ответил, что это возможно. Как вы уже догадались, неверно. Так делать нельзя:

 

Альтернатива, которую нам предлагают, довольна неуклюжая:

Вопрос, что же помешало разработчикам сделать более короткую запись, т.е. автоматическое "восходящее преобразование generic коллекций"? Лежит же на поверхности...

  Legal identifiers in Java.

48
Находится в разделах:

В этой статье я собственной рукой написал следующее:

"Идентификатор может содержать один или несколько символов. Имя переменной может начинаться с любой буквы, знака подчеркивания или символа $. Далее могут следовать буквы, цифры, знак $ или символ подчеркивания...."

Сейчас, я понимаю, что это не совсем правдаLaughing

 

Неточность содержится в вот этих двух словах:

"..знака подчеркивания..."

 

На самом деле, идентификатор переменной может содержать любой обьединяющий символ ( connecting character), например, нижнее подчеркивание (_).

А вот сам список этих же самых объединяющих символов: http://www.fileformat.info/info/unicode/category/Pc/list.htm. 

 

Исходя из этого, видим, что абсолютно правильным (со стороны Java, но не здравого смысла) будет имя переменной вида:

 


  Java puzzler. Part 1.

47
Находится в разделах:

Сегодня в сети нашел pdf с java головоломками.

В доке 9 примеров. Ни автор, ни издательство не указано...

Как правило, если я и выкладываю что то типа головоломок-вопросов, то это все исключительно моего авторства. :)

Однако, сейчас попробую выложить примеры из pdf.

Не знаю, насколько это правильно и интересно ли кому либо... Можете оставить отзыв по этому поводу в коментах.

 

С лирической частью закончили, вперед,  puzzler 1:


The following program adds two hexadecimal, or “hex,” literals and prints the
result in hex. What does the program print? (какой резульат будет выведен в консоль?)

 

 

  Elementary Java.

46
Находится в разделах:

Вот еще одна задачка, которая затрагивает основы основ:

 

 

 

Как Вы думаете, какие значения будут выведены в консоль? 

 

P.S. ну только же не надо сразу бежать открывать Eclipse...Laughing

  Играем в компилятор. Часть 2.

49

Сразу же в догонку к первому посту еще одна задачка, правда уже на порядок проще.

 

Есть у Вас вот такой код: 

 

Представляем себя компилятором.... и оглашаем вердикт: работоспособен код или нет. Laughing

  Играем в компилятор.

54
Находится в разделах:

Есть вот такой код:

 

 

Теперь, представте себя на секундочку компилятором. Захотите ли вы компилировать и выполнять данный код?

 

Если нет, то, почему? Laughing

max аватар

  Аргументы методов в Java : pass-by-value or pass-by-reference

53
Находится в разделах:

В Java и примитивы, и ссылки на объекты передаются по значению.  Если передаем примитив, скажем int(3), то его значение так и передастся в метод, выделив небольшой участок памяти на вершине стека вызова метода. Если же мы передаем в метод объект, то в метод будет передано значение копии ссылки на объект. 

Спецификация по Java гласит, что все в джава передается по значению (pass-by-value). Соответственно, не существует такого понятия, как передача по ссылке. 

Важным моментом является осознание того, что 

является не реальным объектом, а лишь указателем на объект Dog  в памяти.

Когда мы создали новый объект и передали его в метод

на самом деле, мы передали значение адреса в памяти, по которому находится только что созданный объект класса Dog.

Предположим, 

что объект класса Dog находится в памяти по вымышленному адресу 42.  При вызове метода, мы на самом деле передаем значение 42ю 

Посмотрим что произойдет при выполнении метода:

max аватар

  Все о String.intern()

53
Находится в разделах:

Думаю, что многие Java-разработчики знают или хотя бы слышали о методе String.intern(). Но далеко не каждый использует его в своих приложениях или представляет в каких случаях он полезен и полезен ли вообще. Так было и со мной до тех пор пока я не столкнулся с этим методом в одном из проектов. В тот момент я захотел узнать смысл и особенности его использования и набрел на одну весьма интересную статью ведущего разработчика Yahoo! по имени Ethan Nicholas.

  Elementary Java.

64
Находится в разделах:

Есть у нас вот такая замечателньая программа:

которая выдаст нам ошибку времени выполнения.

 

Как с помощью  добавления в код всего лишь одного символа (не цифрры!!) избежать RuntimeException и получить работоспособную программу?

 

Предлагайте варианты, их много Laughing

max аватар

  Загадочный NPE

83
Находится в разделах:

Каждый день узнаю что-то новое.  Оказывается, 

Так вот, ближе к делу. 

Есть Map:

  Когда есть свободная минутка. Java задача.

91

Поздним пятничным утром, сидя тихонечко в офисе, попивая чай и стуча по клавишам получаю в скайпе сообщение с любопытненькой задачкой:

 

Дан массив типа byte размерностью 100 на 100 элементов. Реализовать ОПТИМАЛЬНЫЙ метод определения наличия в данном массиве дублирующихся значений.

 

Предлагаю и вам подумать над решением. Smile

  Имя переменной в Java.

98
Находится в разделах:

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

Итак, привожу цитату из документации:

A variable's name can be any legal identifier — an unlimited-length sequence of Unicode letters and digits, beginning with a letter, the dollar sign "$", or the underscore character "_".

тут нам говорят, что в качестве имени переменной мы можем задавать любой допустимый идентификатор, который является последовательностью неограниченной длины букв или цифр в формате Юникод, которая в обязательном порядке должна начинаться с буквы или знака доллара, или символа нижнего подчеркивания.

Ну, вроде как все понятно. Однако меня смутило вот это выражение: "unlimited-length" - неограниченная длина. Как это понять? Неограниченность  - это же бесконечность. Но ведь так не может быть. Всему должны же быть какие то пределы, какие то рамки, согласитесь.
Давайте же попытаемся разобраться, как обстоят дела на самом деле.

max аватар

  Java. Как создать объект обобщенного типа? How is a generic type instantiated?

100
Находится в разделах:

Для того, чтобы использовать обобщенный тип, необходимо совершить подстановку реальных типов данных в каждый из параметров, объявленных в обобщенном типе. Список типов аргументов - это список, разделенный запятыми, и помещенный в угловые скобки. 

Пример обобщенного типа:

Если мы хотим использовать обобщенный тип Pair, мы должны задать типы аргументов, которые должны быть замещены. Тип аргумента может быть конкретным ссылочными типом, например, String, Long, Date. 

max аватар

  Java. Что такое параметризированный или обобщенный тип? / What is a parameterized or generic type?

102
Находится в разделах:

Обобщенный тип - это тип с формальными типами параметров. Параметризованный тип - это создание объекта обобщенного типа с реальными типами аргументов. 

 

Обобщенный тип - это ссылочный тип, который содержит один или более параметров. Эти типы параметров затем заменяются типами аргументов, во время создания объекта. 

Пример (обобщенный тип):

Интерфейс Collection содержит один параметр E. Тип параметра E - это всего лишь абстракция, которая позднее будет заменена реальным типом аргумента. Создание объекта обобщенного типа с реальными типами аргументов называется параметризованным типом.

max аватар

  Java. Что такое дженерики? / What is Java Generics?

102
Находится в разделах:

Дженерики в Java - это фича языка, которая позволяет определять и использовать обобщенные типы и методы. 

"Java Generics" - это технический термин, обозначающий набор свойств языка позволяющих определять и использовать обобщенные типы и методы. Обобщенные типы или методы отличаются от обычных тем, что имеют типизированные параметры. 


Примером дженериков или обобщенных типов может служить библитека с коллекциями в Java. Например, класс LinkedList<E> - типичный обобщенный тип. Он содержит параметр E, который представляет тип элементов, которые будут храниться в коллекции. Вместо того, чтобы просто использовать LinkedList, ничего не говоря о типе элемента в списке, мы можем использовать LinkedList<String> или LinkedList<Integer>.  Создание объектов обобщенных типов происходит посредством замены параметризированных типов реальными типами данных. Класс типа LinkedList<E> -  обобщенный тип, который содержит параметр E. Создание объектов, типа LinkedList<String> или LinkedList<Integer> называются параметризированными типами, а String и Integer - реальные типы аргументов. 

max аватар

  Java. Замена символов в строке / Replacing characters in string

83
Находится в разделах:

Вот решил заняться изобретением очередного "велосипеда". 

В классе String есть замечательный метод replaceAll(), который заменяет символы/подстроки в данной строке.  Работает он отлично до тех пор, пока заменяемая строка не будет содержать специальных символов, входящих в семантику регулярных выражений. Вот тут и начинается фигня (с точки зрения человека, не знакомого с регулярными выражениями ) с заменой. А ведь замена подстроки в строке задача не такая уже и тяжелая и поддерживается в большинстве языков программирования. 

Так вот, зачем этот пост. Этот пост для тех, у кого нет ни малейшего желания изучать регулярные выражения (regular expressions / regexp). 

Вот пример аналогичной функции, своего шестиколесного велосипеда, выполняющего аналогичные функции, но абсолютно не понимающего регулярных выражений. То есть, если вы попросите его заменить подстроку "[][/23x1]" или еще какую-нибудь хитрую подстроку в строке, то она заменит именно эти вхождения в строку, а не будет вычислять  "[][/23x1]", пытаясь найти в нем какой-то паттерн. 

Вот, собственно, и код:

max аватар

  Java. Как получить путь к проекту? / How to get project path?

80
Находится в разделах:

В некоторых случаях необходимо получить абсолютный путь к папке текущего проекта из Java кода. 

Это может понадобиться, например, при написании юнит-теста, который считывает, допустим, xml ресурсы из папки, которая не лежит в classpath, но находится в подпапке проекта.

Один из методов получения абсолютного пути выглядит следующим образом:

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

 

Поправочка:

Код будет давать верный путь, если не будет "махинаций" с Вашей стороны. Например, антом скопировать  бинарные классы куда-нибудь в project_root/bin/test/bla/bla.

Код работает, например, если проект в эклипесе, и классы складываются в project_root/bin как по умолчанию.

  Допустима ли такая форма записи?

76
Находится в разделах:

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

max аватар

  Core java. Примеры, в которых зарыта собака

81
Находится в разделах:

Пример 1

Какой будет результат?

Варианты ответов:

  • 21-2
  • 11-2
  • 12-1
  • 11-1 

 

Пример 2

Какой результат выполнения данного кода?

Варианты ответов:

  • 22-2
  • 12-2
  • 11-1
  • Ошибка компиляции

  Тонкости Java. Инициализатор массива.

83
Находится в разделах:

Есть у нас вот такая строчка кода:

В этой строчке кода мы объявляем переменную f типа "массив, основанный на примитивном типе int". Сначала, мы указали тип переменной, дальше задали ее имя, а квадратные скобки как раз и указываю на то, что f будет у нас массивом. Однако, создание переменной f еще не создает экземпляр самого массива. Давайте же его создадим, с помощью ключевого слова new:

- число 5 - это длина создаваемого массива.