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


113

거기에 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의 새로운 기능을 언급하고 있습니다.


1
기본 유형을 제외한 모든 것은 유형의 변수에 할당 될 수 있으므로 Object일부 작업의 경우 Object원하는 위치에서 사용할 수 있습니다 auto.
— Zyx 2000

1
자바를는 그런 변수가 없습니다
— 알렉세이 Bulgak

@ Zyx2000 : 그러면 to_string실제 개체가 아닌 개체의 기능 을 사용 하지 않겠습니까?
— Games Brainiac 2013-04-21

2
@GamesBrainiac : 아니요, 재정의 된 버전이있는 경우이를 사용합니다.
— Keppil

2
당신이 찾고있는 용어는 "자동"이 아니라 "유형 추론"입니다. 그들은 대부분 제네릭을 참조 불구하고 자바 타입 추론에 대한 꽤 몇 가지 질문은 ... 나는 확실히 중복을 찾는 방법이 아니에요, 그래서이있다

답변:


49

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

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

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

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

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

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


10
@GamesBrainiac 아니요, 메서드 호출은 Java에서 항상 다형성입니다. 그러나 다른 많은 작업 (예 : 과부하 해결 또는에 정의되지 않은 작업 Object)은 이와 같이 수행 할 수 없습니다. 이것은 실제로 좋은 대답이 아니며 질문의 예가 ​​약하기 때문에 작동합니다.

10
이 질문은 autoC 및 C ++ 11 이전의 사용에 관한 것이 아니라 C ++ 11의 유형 추론에 관한 것입니다 . 편집 내용이 주제를 벗어났습니다.

4
"그게 내가 의미하는 바가 아닙니다. 일단 Object에 캐스팅하면 Object의 to_string을 제공합니다."False. 절대적으로 100 % 거짓입니다.
— Louis Wasserman 2013

140
"인간은 중복성으로부터 이익을 얻습니다." 사실입니다. 매일 아침 일어나서 "어떻게하면 코드를 더 중복되게 만들 수 있을까?"라고 생각합니다. 이점 때문입니다.
— ahoffer

2
또한이 답변은 varJava 9 이후 예약 된 키워드 이기 때문에 사용되지 않습니다.
— 6infinity8

69

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

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

에서 JDK 향상 제안 286


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


6
예, 개선되었지만 해당 키워드는 지역 변수에서만 작동합니다. 아니 C ++ 자동 형식 유추 강력한 등
— texasbruce

7
Minor nit-pick : var키워드가 아닙니다! 로부터 JLS : "VAR은 키워드, 오히려 지역 변수 선언의 형식으로 특별한 의미 식별자 아니다". 따라서 키워드와 달리 변수 또는 메서드 "var"를 호출하는 것을 막을 수는 없습니다.
— Klitos Kyriacou

2
좋은 포인트 @KlitosKyriacou. 그러나 '키워드'를 '식별자'로 바꾸거나 심지어 '지역 변수 선언의 유형과 같이 특별한 의미를 가진 식별자'로 바꾸면 대답이 명확하지 않을 것이라고 생각합니다. 그러나 네, var실제로 키워드 목록에 없습니다.
— sorrymissjackson

단순히 이전 버전과의 호환성을위한 키워드가 아닙니다. 이 이름으로 식별자를 가질 수 있다는 사실 외에도 var는 키워드 역할을합니다.
— facetus

25

Java 7은 다이아몬드 구문을 소개 합니다.

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

이전 자바와 비교

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

비판적 독자는이 새로운 구문이 원래 질문에서 for 루프를 작성하는 데 도움이되지 않는다는 것을 알게 될 것입니다. 그것은 정확하고 완전히 의도적 인 것 같습니다. Oracle의 버그 데이터베이스를 인용하는 다른 답변을 참조하십시오.


4
사실,하지만 그가 (내가) 찾고있는 것은 같은입니다 auto integerBox = new Box<Integer>();, 이것은 일반적으로 때로는 같은 복합 할 수있는 기능에서 반환 값을 얻기 위해 사용된다HashMap<String, LinkedList<Operation, Set<Integer>>>
— Roee Gavirel

1
그 우려는 코드 샘플 이후에 정확히 언급 한 것입니다. 결론은 자바가 그렇게하지 않는다는 것입니다.
— Tarrasch 2014 년

18

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);

8

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


또는 계산 hashCodes, 또는 클래스 이름 수집, 또는 ... 당신은 아이디어를 얻었습니다;) 그러나 목록은 짧습니다. 참조 개체 클래스의 문서 (초보자를위한 의미 의견을, 나는 확실히 당신이 SimonC 그것을 알고있어)
— 알렉산더 Malakhov

4

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

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.