source

Java에 auto type이 있나요?

goodcode 2022. 9. 23. 00:14
반응형

Java에 auto type이 있나요?

여기도 있어요?autoC++에서처럼 자바에서도 변수 타입을 사용할 수 있습니까?

예:

for ( auto var : object_array)
    std::cout << var << std::endl;

for( auto var : object_array)
    var.do_something_that_only_this_particular_obj_can_do();

Java에 확장 루프 기능이 있는 것은 알고 있습니다만, auto가 있습니까?그렇지 않다면, 이것을 하는 데 묘안이 있나요?C++11의 신기능을 참조하고 있습니다.

Java 10은 사용자(및 나)가 원하는 기능을 가지고 있을 수 있습니다.var키워드를 지정합니다.

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

JDK 확장 제안서 286에서


업데이트: Yap, 이 기능은 Java 10 릴리즈에 추가되었습니다!

Java 10은varC++와 같은 식별자autosorrymissjackson의 답변을 참조하십시오.

Java 10보다 이전 버전에서는auto키워드를 지정합니다.다음과 같은 루프를 실현할 수 있습니다.

for ( Object var : object_array)
  System.out.println(var);

Java에는 로컬 변수가 있으며, 해당 변수는 정의된 블록 내에 있습니다.C 및 C++와 비슷하지만 auto 키워드 또는 register 키워드는 없습니다. 단, Java 컴파일러는 명시적으로 초기화되지 않은 로컬 변수를 사용할 수 없으며 컴파일 오류가 발생합니다(C 및 C++와는 달리 컴파일러는 보통 경고만 표시합니다).우대:위키피디아.

Java에서는 C++와 같은 메인스트림 타입 인퍼런스는 없었습니다.RFE는 있었지만 "Will not fix"로 종료되었습니다.주어진 내용은 다음과 같습니다.

인간은 두 가지 방법으로 유형 선언의 중복성으로부터 이익을 얻는다.우선 다중 유형은 귀중한 문서로서 기능합니다.독자는 getMap() 선언을 검색하여 어떤 유형을 반환하는지 확인할 필요가 없습니다.둘째, 용장성은 프로그래머가 의도된 유형을 선언할 수 있도록 하며, 따라서 컴파일러에 의해 실행되는 크로스 체크로부터 이익을 얻는다.

Java 7은 다이아몬드 구문을 도입했습니다.

Box<Integer> integerBox = new Box<>(); // Java 7

오래된 자바와 비교해서

Box<Integer> integerBox = new Box<Integer>(); // Before Java 7

이 새로운 구문은 원래 질문의 for 루프를 쓰는 데 도움이 되지 않습니다.맞습니다. 그리고 전적으로 의도적인 것 같습니다.Oracle의 버그 데이터베이스를 인용하는 다른 답변을 참조하십시오.

Java 8에서는 람다 유형 추론을 사용하여 유형이 선언되지 않도록 할 수 있습니다.질문자의 예와 유사한 예는 다음과 같습니다.

object_array.forEach(obj -> System.out.println(obj)); 
object_array.forEach(obj -> obj.do_something_that_only_this_particular_obj_can_do());

두 가지 모두 방법 참조를 사용하여 단순화할 수 있습니다.

object_array.forEach(System.out::println); 
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);

즉, 자동 타입은 없습니다.값을 인쇄하는 것밖에 할 수 없는 경우는, 그 값을 「Value」라고 부릅니다.Object.

순수한 자바 솔루션은 아니지만 lombok이라는 라이브러리를 추가하면 아래와 같은 마법이 컴파일되고 동작할 수 있습니다.autoC++ 키워드

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}

언급URL : https://stackoverflow.com/questions/16132759/is-there-auto-type-inferring-in-java

반응형