거기에 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의 새로운 기능을 언급하고 있습니다.
답변
문제가되기 전에 답변 수정 됨 :
auto
Java 에는 변수 유형 이 없습니다 . 동일한 루프를 다음과 같이 얻을 수 있습니다.
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>
업데이트 : Yap, 그 기능이 Java 10 릴리스에 포함되었습니다!
답변
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());
}