[java] Java에 자동 유형 추론이 있습니까?

거기에 auto당신이 C에서이 같은 자바에서 변수 유형 ++?

예 :

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에 향상된 for 루프가 있다는 것을 알고 있지만 자동이 있습니까? 그렇지 않다면 해킹이 있습니까? C ++ 11의 새로운 기능을 언급하고 있습니다.



답변

문제가되기 전에 답변 수정 됨 :

autoJava 에는 변수 유형 이 없습니다 . 동일한 루프를 다음과 같이 얻을 수 있습니다.

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

Java에는 정의 된 블록 내에 범위가있는 지역 변수가 있습니다. C 및 C ++와 유사하지만 auto 또는 register 키워드가 없습니다. 그러나 Java 컴파일러는 명시 적으로 초기화되지 않은 지역 변수의 사용을 허용하지 않으며 컴파일 오류를 제공합니다 (컴파일러가 일반적으로 경고 만 제공하는 C 및 C ++와는 다름). 제공 : Wikipedia .

아니요, C ++와 같은 Java에는 주류 유형 추론이 없습니다. RFE 가있었습니다 하지만 “이 해결되지 않습니다”로 폐쇄 된 이유 부여했다 :

인간은 두 가지 방식으로 유형 선언의 중복성으로부터 이익을 얻습니다. 첫째, 중복 유형은 귀중한 문서 역할을합니다. 독자는 어떤 유형을 반환하는지 찾기 위해 getMap () 선언을 검색 할 필요가 없습니다. 둘째, 중복성을 통해 프로그래머는 의도 한 유형을 선언 할 수 있으므로 컴파일러가 수행하는 교차 검사의 이점을 얻을 수 있습니다.


답변

Java 10은 var키워드를 통해 원하는 것을 가질 수 있습니다 .

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

에서 JDK 향상 제안 286


업데이트 : Yap, 그 기능이 Java 10 릴리스에 포함되었습니다!


답변

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(var -> System.out.println(var));
object_array.forEach(var -> var.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);


답변

요컨대, 자동 유형이 없습니다. 그래도 값을 인쇄하는 것이 전부라면 값을 Object.


답변

순수한 Java 솔루션은 아니지만 lombok 이라는 라이브러리를 추가하면 아래의 마법 auto이 C ++의 키워드 와 매우 유사하게 컴파일 및 작동 할 수 있습니다.

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


답변