Java var не работает

Почему var в JAVA 10 не может быть инициализирован нулем?

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

Это означает, что если разработчик инициализирует var с нулевым значением, он определенно хочет поместить в него объект, а не буквальный val. Если это дело, мои вопросы здесь Почему компилятор не считает это Object var и вместо этого выдает ошибку. С другой стороны, если вы пишете инструкцию ниже, она отлично работает:

В чем причина объявления var с нулевым значением Рассмотрим ниже случай, когда я хочу инициализировать var и хочу использовать его за пределами блоков условий:

var a = null; if(some condition) Initialize with some arguements else Initialize with some other arguements //Use a varialble here 

Таким образом, в этом случае, поскольку мы хотим, чтобы область a была вне условных блоков, у нас есть требование для инициализации, она будет иметь значение null вне, если блок, который невозможен с помощью var.

Как мы знаем, есть некоторые требования, когда мы не хотим создавать экземпляр в первую очередь, но также для того, чтобы оставить область действия вне блоков условий, мы должны инициализировать переменные с нулевым значением, что невозможно в случае var

Можно предположить, что это Object , но это не так полезно. Если вам нужна переменная Object , вы можете объявить ее как Object a . Переменные типа Object не используются так часто, потому что для большинства целей ваша переменная должна быть более определенного типа.

@khelwood Я согласен, но в этом случае проблемы, когда нам нужно расширить область действия переменной, будут проблемой

Это одна из тонкостей, упомянутых в JEP-286 . « Если инициализатор имеет нулевой тип, возникает ошибка — как переменная без инициализатора, эта переменная, вероятно, должна быть инициализирована позже, и мы не знаю, какой тип будет востребован «.

@All Все это очень плохо смотреть на голосование по этому вопросу без какой-либо причины. Ожидайте какое-то предложение, когда кто-то не голосует. Более того, это очень простой вопрос, как будто мы можем сделать Object x = null; почему мы не можем сделать это var x = null;

@khelwood Ваше утверждение о том, что компилятор не может определить правильный тип, неверно. То, что компилятор не может сделать, это прочитать ваши мысли и представить, какие значения (кроме null ) вы можете планировать присвоить этой переменной в будущем. Компилятор может правильно сделать вывод, что тип является типом Null (который может содержать только null), но поскольку объявление переменной типа Null очевидно, бесполезно, он выдает ошибку вместо того, чтобы делать то, что явно не имеет в виду пользователь.

Читайте также:  Java streaming api filter

@BrianGoetz Итак, «Компилятор не может определить правильный тип переменной для ваших целей ». Я думал, что это было уже достаточно ясно.

@BrianGoetz Кто сказал, что null значение должно быть выведено как Void ? Класс Void — это просто класс с закрытым конструктором, и JLS не делает с этим классом ничего особенного. Я могу написать другой класс с закрытым конструктором, который делает единственную допустимую ссылку null .

9 ответов

Существуют (по крайней мере) три возможные стратегии вывода типов, которые компилятор может применить к var o = null :

  • выбрать Void
  • выбрать Object
  • найдите более позднюю инициализацию и выберите этот тип

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

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

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

var parent = null; // imagine some recursion or loop structure, so this makes more sense processNode(parent); // expects a parameter of type 'Node' parent = determineParent(); // returns a parameter of type 'Node' 

Если компилятор допустил Node для parent потому что determineParent() возвращает его, это скомпилируется. Но код является хрупким, потому что изменения в последней строке могут привести к выбору другого типа в первой строке и, следовательно, для компиляции ошибок во второй строке. Это нехорошо!

Мы привыкли к тому, что изменение объявления типа может привести к ошибкам в будущем, но здесь изменение (строка 3), его эффект (строка 1) и последующая ошибка (строка 2) могут быть довольно далеко друг от друга, что делает разработчикам гораздо сложнее понять или, лучше, предсказать, что произойдет.

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

добавление

Есть сомнения, действительно ли вариант 3, выводящий тип из более поздней инициализации, технически выполним. Мое мнение (что это такое) основано на моем понимании JEP 286, а именно:

С другой стороны, мы могли бы расширить эту функцию, включив локальный эквивалент «пустых» финалов (т.е. Не требуя инициализатора, вместо этого полагаясь на определенный анализ присваивания). Мы выбрали ограничение на «переменные с инициализаторами», потому что это охватывает значительную часть кандидатов, сохраняя при этом простоту функции и уменьшая ошибки «действия на расстоянии».

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

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Читайте также:  Стилизация radio css примеры

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lombok, Eclipse and JDK10 fails when using the var keyword #1676

Lombok, Eclipse and JDK10 fails when using the var keyword #1676

Comments

If using the ‘var’ keyword in Eclipse with Lombok and JDK10 I get the following error in Eclipse:

‘var’ is not allowed here
Using the latest Edge build of Lombok: version: 1.16.21 (2018-04-23 21:43:58 UTC)

If I remove Lombok it works.

java10-vs-lombok-var

The text was updated successfully, but these errors were encountered:

I have the same problem. I’m using the latest release of Eclipse Oxygen. If I put lombok on eclipse, «var» doesn’t work. In another issues of lombok project, people said that using lombok edge (https://projectlombok.org/download-edge) would fix. Even with the referred version of lombok, I can’t use «var».

Did you remove import lombok.var ?

rspilker added the parked Without further feedback this bug cannot be processed. If no feedback is provided, we close these. label May 14, 2018

Yep, there is no trace of Lombok in any import. Here is some sample code:

package perfparse; public class TestLombok < public static void main(String[] args) < var i = 0; >> 

In eclipse the «var» has a error on it which says:
‘var’ is not allowed here Parse.java /perfparse/src/main/java/perfparse line 49 Java Problem

Same in Intellij IDEA. Since a «full JDK 10 supported» had been anounced, I have migrated to JAVA 10 and removed all import lombok.var to switch to JAVA’s var and got IDE errors.
What’s even worse, a maven compilation succeds after removing imports, but it fails when imports are present. So I have to migrate back to JDK 8 (because BOTH IDE and maven compilation must work)

The new 1.6.22 release seems to have fixed this. At least it did for me on Eclipse.

I’ll give it a shot. Is an IntelliJ user here other than me, who can confirm the issue?

Still not working on Eclipse Oxygen.3a for me. Same problem as before.

Same problem in Visual Studio Code with Lombok version 1.16.22.

If you are using «import lombok.var» VSCode thinks that code is fine but Gradle doesn’t build it. If you aren’t using import VSCode thinks that code has errors, but Gradle build it without problems.

Looks like a plugin(s) problem to me. I propose to change title of the issue to:
«Lombok, Eclipse/IntelliJ Idea/VSCode and JDK10 fails when using the var keyword»

Is this commit related to fixing this issue?

Is there any progress on resolving the issue?

rspilker removed the parked Without further feedback this bug cannot be processed. If no feedback is provided, we close these. label Jun 4, 2018

Not progress yet, we do not know why if the import is not present the IDEs give errors.

Did someone test this in an IDE without lombok installed?

We fixed it for Eclipse. for IntelliJ or VSCode, please register issues in their projects.

Читайте также:  Creating exception object in java

Roel, it looks like your patch reacts to the presence of the import lombok.var. Pretty cool. I was expecting some patch that just detected JDK 10+ and just disabled the feature. This is cool because (I think) it says «if the import is there, apply Lombok».

Hello, may I ask about this issue: how it has been resolved if it’s been resolved?

With the latest Eclipse Java EE IDE for Web Developers Version: 2018-09 and the latest lombok 1.18.2 I am still getting this error when the Eclipse’s JVM is instrumented with -javaagent:lombok.jar even if there is no import of the lombok.var type anywhere in the Java source code and the lombok.jar is not among the project’s dependencies. It does not matter if the compiler compliance level is Java 10 or Java 11

With current version of Lombok (1.18.2) and VS Code everything work like charm when you are using Java 8, Java 9, Java 10 or Java 11. Haven’t tested with Java 12 EA yet 😉

VS Code and Eclipse are using similar technologies for Java so i am quite sure that everything works with latest Eclipse as well especially if configured right.

With VS Code i am using following configuration:

«folders»: [
«path»: «.»
>
],
«settings»: «java.home»: «/opt/java/java-11»,
«java.configuration.updateBuildConfiguration»: «automatic»
«java.jdt.ls.vmargs»: «-javaagent:/home/eero/java/lombok/1.18.2/lombok.jar -Xbootclasspath/a:/home/eero/java/lombok/1.18.2/lombok.jar»
>
>

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java «var cannot be resolved to a type» — JDK 13.0 #313

Java «var cannot be resolved to a type» — JDK 13.0 #313

Comments

VSCode Java extension seems to raise error while using var data type (type inference for local variables was introduced way back with Java 10). Running the project also seems to fail while using var datatype.

There’s absolutely no problem with my Java environment. Compiling and running the same Java file using javac and java succeeds in command line. This works fine with IntelliJ IDEA as well.

Is there some setting or configuration I need to change? Screenshot of Java runtime configuration page below:-

java 13.0.2 2020-01-14 Java(TM) SE Runtime Environment (build 13.0.2+8) Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing) 

Error

image

Configure java runtime — JDK 13

image

Extension version: 0.8.1
VS Code version: Code 1.42.1 (c47d83b293181d9be64f27ff093689e8e7aed054, 2020-02-11T14:45:59.656Z)
OS version: Windows_NT x64 10.0.18362

The text was updated successfully, but these errors were encountered:

Источник

Оцените статью