Java10, var & Impossible types
От: bzig  
Дата: 02.04.18 02:04
Оценка: 6 (2) +1
Я видел много обсуждений этого var и он мне, вообщем-то, казался приятным сахарком, но не обязательным.

Оказывается, за ним стоит одна прикольная фича — Impossible types

Подробности тут http://benjiweber.co.uk/blog/2018/03/03/representing-the-impractical-and-impossible-with-jdk-10-var/

Я компильнул пример оттуда — работает!
$ cat Main.java
public class Main {
        public static void main(String ... args) {
                var person = new Object() {
                        String name = "bob";
                        int age = 5;
                };

                System.out.println(person.name + " aged " + person.age);
       }
}

$ ../jdk-10/bin/javac Main.java

$ ../jdk-10/bin/java Main
bob aged 5
Отредактировано 02.04.2018 2:10 мамут ушёл, и я пойду . Предыдущая версия .
Re: Java10, var & Impossible types
От: vsb Казахстан  
Дата: 02.04.18 07:43
Оценка:
Есть ещё один интересный тип: catch (Exception1 | Exception2 e). Если проявить воображение, эту фичу наверняка можно заабузить для чего-нибудь прикольного
Отредактировано 02.04.2018 7:43 vsb . Предыдущая версия .
Re[2]: Java10, var & Impossible types
От: bzig  
Дата: 02.04.18 12:03
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Есть ещё один интересный тип: catch (Exception1 | Exception2 e). Если проявить воображение, эту фичу наверняка можно заабузить для чего-нибудь прикольного


Насколько я понимаю, никакого интересного типа тут нет — "e" получает тип ближайшего общего предка. Соответственно, к уникальным полям/методам Exception1/2 ты доступа не имеешь (без явного каста)
Re: Java10, var & Impossible types
От: serb Россия  
Дата: 02.04.18 19:28
Оценка:
Здравствуйте, bzig, Вы писали:

Из этого вытекает другая фича, невозможно переприсвоение таких переменных.

var person = new Object() {};
person = new Object() {}; // Compile ERROR
переменной person нельзя присвоить другой Object.
Re[2]: Java10, var & Impossible types
От: bzig  
Дата: 02.04.18 20:25
Оценка: +1
Здравствуйте, serb, Вы писали:

S>Здравствуйте, bzig, Вы писали:


S>Из этого вытекает другая фича, невозможно переприсвоение таких переменных.


S> var person = new Object() {};

S> person = new Object() {}; // Compile ERROR
S>переменной person нельзя присвоить другой Object.

Ну так и правильно — ты неявно создал два анонимных класса и они не присваиваются друг другу.
Re[3]: Java10, var & Impossible types
От: UDI Россия  
Дата: 10.04.18 19:36
Оценка:
Здравствуйте, bzig, Вы писали:

B>Здравствуйте, serb, Вы писали:


S>>Здравствуйте, bzig, Вы писали:


S>>Из этого вытекает другая фича, невозможно переприсвоение таких переменных.


S>> var person = new Object() {};

S>> person = new Object() {}; // Compile ERROR
S>>переменной person нельзя присвоить другой Object.

B>Ну так и правильно — ты неявно создал два анонимных класса и они не присваиваются друг другу.


Не просто анонимные классы, а классы, расширяющие Object. Если бы слева был Object, то все ok. Другое дело имеет ли это смысл. Например, присваивать разные реализации одного и того же интерфейса какой-то переменной в методе класса-фабрики с целью ее инициализации и возвращения наверх.
"Не волнуйся, голова! Теперь будет думать компьютер"
Гомер Джей Симпсон
Re[4]: Java10, var & Impossible types
От: bzig  
Дата: 11.04.18 00:50
Оценка:
B>>Ну так и правильно — ты неявно создал два анонимных класса и они не присваиваются друг другу.

UDI>Не просто анонимные классы, а классы, расширяющие Object. Если бы слева был Object, то все ok.


Открою тебе секрет — анонимные классы по определению расширяют какой-то класс. Ну и чтобы два раза не вставать — все классы в Яве расширяют Object
Re[5]: Java10, var & Impossible types
От: UDI Россия  
Дата: 11.04.18 19:09
Оценка:
Здравствуйте, bzig, Вы писали:



B>>>Ну так и правильно — ты неявно создал два анонимных класса и они не присваиваются друг другу.


UDI>>Не просто анонимные классы, а классы, расширяющие Object. Если бы слева был Object, то все ok.


B>Открою тебе секрет — анонимные классы по определению расширяют какой-то класс. Ну и чтобы два раза не вставать — все классы в Яве расширяют Object


Ok, так. Все расширяют, но не все экземпляры это экземпляры нужных тебе классов, т.е. то о чем по-моему serb тебе говорил, что теперь "неявность" вроде var приводит напротив к абсолютно явному определению типа, хотя и неявномсу для самого разработчика. И то самое "переприсваивание" в такой записи невозможно.
"Не волнуйся, голова! Теперь будет думать компьютер"
Гомер Джей Симпсон
Re[6]: Java10, var & Impossible types
От: bzig  
Дата: 12.04.18 00:46
Оценка:
UDI>И то самое "переприсваивание" в такой записи невозможно.

Да, поэтому полноценных туплов всё ещё нет. С другой стороны кое-какое присваивание всё-таки возможно. Например, если в потоке насоздавал объектов некоего "невозможного" типа и собрал в коллекцию, то потом можно этими объектами манипулировать: менять местами в коллекции, присваивать элементы коллекции переменным и потом манипулировать этими переменными, в том числе и переприсваивать. Главное, чтобы определение анонимного класса было в одном месте только (у серба было в двух).
Re[7]: Java10, var & Impossible types
От: bzig  
Дата: 12.04.18 00:59
Оценка: 4 (2)
B> С другой стороны кое-какое присваивание всё-таки возможно.

$ cat Main.java
public class Main {
        public static void main(String ... args) {

                var list = java.util.stream.Stream.of("Bob","Alice")
                        .map(s ->  new Object() {
                                String name = s;
                                int age = 5;
                        })
                        .collect(java.util.stream.Collectors.toList());

                var first = list.get(0);
                var second = list.get(1);
                System.out.println("first is "+first.name + ", second is " + second.name);
                var swap = first;
                first = second;
                second = swap;
                System.out.println("first is "+first.name + ", second is " + second.name);
        }
}

$ ../jdk-10/bin/javac Main.java

$ ../jdk-10/bin/java Main
first is Bob, second is Alice
first is Alice, second is Bob
Re[8]: Java10, var & Impossible types
От: UDI Россия  
Дата: 12.04.18 19:28
Оценка:
Здравствуйте, bzig, Вы писали:


B>> С другой стороны кое-какое присваивание всё-таки возможно.


B>
B>  var list = java.util.stream.Stream.of("Bob","Alice")
B>                        .map(s ->  new Object() {
B>                                String name = s;
B>                                int age = 5;
B>                        })
B>                        .collect(java.util.stream.Collectors.toList());
B>


Да, так получается. Но тут в функции отражения (map) создается лишь один анонимный класс AC1 (точнее создается он при компиляции) и затем используется столько экземпляров AC1, сколько нужно для преобразования потока данных. Получается список экземпляров AC1. И везде за var скрывается AC1.
В общем, как по мне, так это еще один "сахарок", интересный, и применять его надо к месту. К сожалению, скорее всего использовать его будут везде-везде и это будет приводить к казусам и неочевидностям.
"Не волнуйся, голова! Теперь будет думать компьютер"
Гомер Джей Симпсон
Re[9]: Java10, var & Impossible types
От: bzig  
Дата: 12.04.18 20:43
Оценка:
UDI>так это еще один "сахарок"

Как раз не сахарок. Вместо var тут ничего нельзя поставить, чтобы работало. Только создавать настоящий класс. Т.е. этот var превратил impossible type в possible
Re[2]: Java10, var & Impossible types
От: Pavel Dvorkin Россия  
Дата: 30.04.18 15:08
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Есть ещё один интересный тип: catch (Exception1 | Exception2 e). Если проявить воображение, эту фичу наверняка можно заабузить для чего-нибудь прикольного


Это существует , начиная с Java 7

http://www.oracle.com/technetwork/articles/java/java7exceptions-486908.html
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.