programing

어떤 자바 섬에 있는 C#'var의 키워드의 가치야?

procenter 2022. 7. 21. 22:49
반응형

어떤 자바 섬에 있는 C#'var의 키워드의 가치야?

그 초본으로 키워드의 C#의 한 사용은 암시형 선언이다.무엇을 의미함에 대한 자바 등가 구문은?

에는 아무도 없다.아아, 여러분은 전체 형식 이름을 입력해야 한다.

Edit:7년 후가 게시되고 지역 변수(에 대한 형식 추론.var)자바 10에 추가되었다.

Edit:6년 만에, 아래에서 만든 일부 최신 의견을 수거하는 것이 게시되고 있다.

  • C#이 그 이유이다.var때문에 지방에서 이름이 없다 유형 수 있는 키워드다.NET. 사람들:

    var myData = new { a = 1, b = "2" };
    

    이 경우, 그것은 적절한 제공하는 것은 불가능할 것.myData. 6년 전, 이 Java(비록 그들이 아주unweildy 장황한 모두 유형, 이름을 가졌다)에 불가능했다.이 평균 시간에 많이 변했다 나는 모른다.

  • var그 같지 않은가.dynamic.varIables는 아직 백퍼센트 정적으로 입력되지요.컴파일되지 않음:

    var myString = "foo";
    myString = 3;
    
  • var는, 문맥상 명백한 타입의 경우에도 도움이 됩니다.예를 들어 다음과 같습니다.

    var currentUser = User.GetCurrent();
    

    내가 책임지는 어떤 암호든 말할 수 있어currentUser가 있다User그 안에서 파생된 클래스입니다.확실히, 고객의 도입이User.GetCurrentint를 반환하면 당신에게 해가 될 수도 있습니다.

  • 이건 이 일과 아무 관련이 없어var다만, 다른 메서드와 함께 메서드를 섀도우 하는 이상한 상속 계층이 있는 경우(예:new public void DoAThing()비가상 메서드는 캐스팅되는 유형의 영향을 받는다는 것을 잊지 마십시오.

    이것이 좋은 디자인을 나타내는 실제 시나리오는 상상할 수 없지만, 예상대로 작동하지 않을 수 있습니다.

    class Foo {
        public void Non() {}
        public virtual void Virt() {}
    }
    
    class Bar : Foo {
        public new void Non() {}
        public override void Virt() {}
    }
    
    class Baz {
        public static Foo GetFoo() {
            return new Bar();
        }
    }
    
    var foo = Baz.GetFoo();
    foo.Non();  // <- Foo.Non, not Bar.Non
    foo.Virt(); // <- Bar.Virt
    
    var bar = (Bar)foo;
    bar.Non();  // <- Bar.Non, not Foo.Non
    bar.Virt(); // <- Still Bar.Virt
    

    전술한 바와 같이 가상 메서드는 이 영향을 받지 않습니다.

  • 아니요, 서투른 방법으로 초기화할 수 없습니다.var실제 변수 없이.

    var foo1 = "bar";        //good
    var foo2;                //bad, what type?
    var foo3 = null;         //bad, null doesn't have a type
    var foo4 = default(var); //what?
    var foo5 = (object)null; //legal, but go home, you're drunk
    

    이 경우는, 낡은 방법으로 실시합니다.

    object foo6;
    

프로젝트에 Lombok을 추가하면 val 키워드를 사용할 수 있습니다.

http://projectlombok.org/features/val.html

JEP - JDK 확장 - 제안

http://openjdk.java.net/jeps/286

JEP 286: 로컬 변수 유형 추론

저자 브라이언 괴츠

// Goals:
var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

3월 20일에 JDK 10이 출시됨에 따라 Java에는varJEP 286에서 지정되어 있는 예약 타입명(키워드가 아닙니다.아래를 참조해 주세요.로컬 변수의 경우 Java 10 이상에서는 다음 사항이 유효합니다.

var map = new HashMap<String, Integer>();

varJava에서 예약된 유형 이름이 거의 동일합니다.var양쪽 모두 암묵적인 입력을 가능하게 하는 C# 키워드(중요한 차이에 대해서는, 이하를 참조해 주세요. varin Java는 다음 컨텍스트(JEP 286: 목표)에서의 암묵적 유형 추론에만 사용할 수 있습니다.

  • 이니셜라이저가 있는 로컬 변수
  • 확장 for-loop 인덱스
  • 전통적인 포루프 방식으로 선언된 지역 주민들

그러므로var 필드, 반환 유형, 클래스 이름 또는 인터페이스 이름에는 사용할 수 없습니다.근거는 JEP 286(Brian Goetz에 의해 작성됨)에 기술되어 있듯이 로컬 변수를 선언 및 정의할 때 긴 유형 이름을 포함할 필요가 없다는 것입니다.

우리는 개발자가 종종 필요 없는 로컬 변수 유형의 매니페스토 선언을 회피할 수 있도록 함으로써 정적 유형의 안전에 대한 자바의 헌신을 유지하면서 자바 코드 작성과 관련된 의식을 줄임으로써 개발자의 경험을 향상시키려 한다.

varJava에서의 범위 지정

유의해야 할 점은var는 Java에서 키워드가 아니라 예약된 유형 이름입니다.JEP 286에서 인용한 내용:

식별자 var는 키워드가 아니라 예약된 유형 이름입니다.즉, 변수, 메서드 또는 패키지 이름으로 var를 사용하는 코드는 영향을 받지 않습니다.클래스 또는 인터페이스 이름으로 var를 사용하는 코드는 영향을 받습니다(다만, 이러한 이름은 통상의 명명 규칙을 위반하기 때문에 실제로는 거의 없습니다).

주의해 주세요.var는 키워드가 아닌 예약된 유형 이름입니다.패키지명, 메서드명, 변수명(새로운 type-interference 롤과 함께)에 사용할 수 있습니다.예를 들어, 다음 예시는 모두 유효하게 사용하는 예입니다.var★★★★★★★★★★★★★★★★★★:

var i = 0;
var var = 1;
for (var i = 0; i < 10; i++) { /* ... */ }
public int var() { return 0; }
package var;

JEP 286에서 인용한 내용:

이 처리는 initializer, 확장 for-loop의 인덱스 및 기존 for-loop으로 선언된 로컬 변수에 한정됩니다.메서드 포멀, 컨스트럭터 포멀, 메서드 리턴 유형, 필드, 캐치 포멀 또는 기타 종류의 변수 선언에는 사용할 수 없습니다.

「 」의 var및 CJava c C in java 。

이것은 와의 현저한 차이점 중 하나이다.varC# Java를 사용합니다.varC# 에서는 유형명으로 사용할 수 있지만 Java 에서는 클래스명 또는 인터페이스명으로 사용할 수 없습니다.C# 매뉴얼(암시적으로 입력된 로컬 변수)에 따르면:

「」라고 하는 경우.var 내에 경우, 그 그 범위 내에 있는 경우입니다.var키워드는 해당 유형 이름으로 해결되며 암묵적으로 입력된 로컬 변수 선언의 일부로 처리되지 않습니다.

「 」를 사용하는 var규칙을 합니다.이러한 은 C#에 의해 회피할 수단은 C#에 의해 됩니다.var에서 ""를 거부하여var클래스명 또는 인터페이스명으로 지정합니다.의 에 대한 내용은 을 해 주세요.varC#의 유형 이름을 참조하십시오.암묵적으로 입력된 변수 선언에 제한이 적용됩니다.'var in Java'의 스코핑 결정의 근거에 대한 자세한 내용은 JEP 286: 스코핑 선택 항목을 참조하십시오.

인텔리J용 플러그인을 만들었습니다.★★★★★★★★★★★★★★★★★,var자바어.해킹이기 때문에 일반적인 면책 조항이 적용되지만, Java 개발에 IntelliJ를 사용하고 시험해 보고 싶다면 https://bitbucket.org/balpha/varsity에 있습니다.

JDK 10에서 지원됩니다.얼리 액세스 빌드에서는 동작도 확인할 수 있습니다.

JEP 286:

Initializer를 사용하여 유형 추론을 로컬 변수 선언으로 확장하도록 Java Language를 향상시킵니다.

이제 글을 쓰는 대신:

List<> list = new ArrayList<String>();
Stream<> stream = myStream();

다음과 같이 기술합니다.

var list = new ArrayList<String>();
var stream = myStream();

주의:

  • var이제 예약된 유형 이름입니다.
  • Java는 여전히 정적 타이핑에 전념하고 있습니다!
  • 로컬 변수 선언에서만 사용할 수 있습니다.

로컬 시스템에 Java를 설치하지 않고 시도하려면 JDK 10이 설치된 Docker 이미지를 생성했습니다.

$ docker run -it marounbassam/ubuntu-java10 bash
root@299d86f1c39a:/# jdk-10/bin/jshell
Mar 30, 2018 9:07:07 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 10
|  For an introduction type: /help intro

jshell> var list = new ArrayList<String>();
list ==> []

간단한 해결책(적절한 IDE를 사용한다고 가정)은 모든 곳에 'int'를 입력한 후 원하는 유형을 설정하는 것입니다.

사실 방금 'var'라는 클래스를 추가했기 때문에 다른 것을 입력할 필요가 없습니다.

코드가 여전히 너무 장황하지만, 적어도 입력할 필요는 없습니다!

Java 10 서서... var

JetBrains의 Kotlin을 볼 수 있지만, 그것은 훌륭합니다.다르지는 않습니다.

추론을 에 현재 10을 가지고 있습니다.varC#은 C#은 C#의 것입니다.

또한 비표시형(프로그래머에 의해 그 자리에 이름을 붙일 수 없는 유형, 그러나 어떤 유형이 비표시형인지는 다르다)을 추론할 수 있다.예를 들어,및 익명 클래스와 함께 트릭(직장에서는 절대 사용하지 않는 것)

제가 찾은 유일한 차이점은 C#에서

var라는 이름의 유형이 범위 내에 있는 경우 var 키워드는 해당 유형 이름으로 해결되며 암묵적으로 입력된 로컬 변수 선언의 일부로 처리되지 않습니다.

10의 Java 10의 경우var는 법적 유형 이름이 아닙니다.

이전 버전인 것은 알지만 var 클래스를 만들고 다른 유형의 컨스트럭터를 만들면 어떤 컨스트럭터를 호출하느냐에 따라 다른 유형의 var를 얻을 수 있습니다.한 유형을 다른 유형으로 변환하는 메서드를 내장할 수도 있습니다.

Lombok 는 var를 지원하지만 여전히 실험으로 분류됩니다.

import lombok.experimental.var;

var number = 1; // Inferred type: int
number = 2; // Legal reassign since var is not final
number = "Hi"; // Compilation error since a string cannot be assigned to an int variable
System.out.println(number);

여기에 그것을 사용하려고 할 때 피해야 할 함정이 있습니다.IntelliJ IDEA자동 완성 등 모든 것이 정상적으로 동작하고 있는 것 같습니다.예를 들어 JEP 286: Local-Variable Type Inference로 인해 "해키하지 않은" 솔루션이 있을 때까지 이 솔루션이 현재 최선의 선택일 수 있습니다.

:val는, 「」에 의한 입니다.Lombok lombok.config.

Java 10에서는 가능합니다만, 로컬 변수의 경우만,

넌 할 수 있다.

var anum = 10; var aString = "Var";

하지만 할 수 없다.

var anull = null; // Since the type can't be inferred in this case

자세한 내용은 사양을 참조하십시오.

일반적으로 오브젝트 클래스는 모든 유형에 사용할 수 있지만, 나중에 타입 캐스팅을 해야 합니다!

예:-

Object object = 12;
    Object object1 = "Aditya";
    Object object2 = 12.12;

    System.out.println(Integer.parseInt(object.toString()) + 2);

    System.out.println(object1.toString() + " Kumar");
    System.out.println(Double.parseDouble(object2.toString()) + 2.12);

이 기능은 현재 Java SE 10에서 사용할 수 있습니다.static, type-safe var가 드디어 java world에 진입했습니다.

출처 : https://www.oracle.com/corporate/pressrelease/Java-10-032018.html

언급URL : https://stackoverflow.com/questions/3443858/what-is-the-equivalent-of-the-c-sharp-var-keyword-in-java

반응형