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.