>Java >java지도 시간 >Java 8의 일반 대상 유형 추론 방법 개선

Java 8의 일반 대상 유형 추론 방법 개선

高洛峰
高洛峰원래의
2017-01-18 11:12:001431검색

1. 제네릭에 대한 간단한 이해

제네릭은 Java SE 1.5의 새로운 기능입니다. 제네릭의 본질은 매개변수화된 유형입니다. 즉, 연산되는 데이터 유형이 매개변수로 지정됩니다. 인기 포인트는 '형변수'다. 이 유형의 변수는 클래스, 인터페이스 및 메소드 생성에 사용될 수 있습니다.

Java 제네릭을 이해하는 가장 쉬운 방법은 이를 일부 Java 유형 변환(캐스팅) 작업을 절약할 수 있는 편리한 구문으로 생각하는 것입니다.

List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);

위 코드 자체에는 다음과 같은 표현식이 있습니다. 매우 명확합니다. 상자는 Apple 개체를 포함하는 목록입니다. get 메소드는 Apple 객체 인스턴스를 반환하며 이 프로세스에서는 유형 변환이 필요하지 않습니다. 제네릭이 없으면 위의 코드는 다음과 같이 작성해야 합니다:

Apple apple = (Apple)box.get(0);

2. 제네릭의 당혹감

제네릭의 가장 큰 장점은 프로그램 유형 안전성을 제공하고 이전 버전과 호환된다는 점이지만, 또한 어색한 부분은 제네릭의 유형을 정의할 때마다 지정해야 한다는 점입니다. 명시적으로 지정하는 것은 다소 장황하게 느껴질 뿐만 아니라 가장 중요한 것은 많은 프로그래머가 제네릭에 익숙하지 않다는 것입니다. 올바른 유형 매개변수를 제공할 수 없는 경우가 많습니다. 이제 컴파일러를 통해 제네릭의 매개변수 유형을 자동으로 유추함으로써 이러한 상황을 줄이고 코드 가독성을 향상시킬 수 있습니다.


3. Java 7의 제네릭 유형 추론 개선

이전 버전에서는 제네릭 유형을 사용하는 경우 값을 선언하고 할당할 때 양쪽에 제네릭 유형을 추가해야 합니다. 예:

Map<String, String> myMap = new HashMap<String, String>();

다음과 같이 생각할 수 있습니다. 변수를 선언할 때 이미 매개변수 유형을 지정했는데 객체를 초기화할 때 왜 다시 지정해야 합니까? 다행히 Java SE 7에서는 이 방법이 개선되어 이제 다음 명령문을 사용하여 값을 선언하고 할당할 수 있습니다.

Map<String, String> myMap = new HashMap<>(); //注意后面的"<>"

이 명령문에서 컴파일러는 일반 유형을 기반으로 변수를 자동으로 선언합니다. HashMap을 인스턴스화할 때 일반 유형이 추론됩니다. 다시 말하지만, 새로운 HashMap 뒤에 있는 "a8093152e673feb7aba1828c43532094"에 주의하세요. 이 "<"를 추가하는 것은 자동 유형 추론을 의미하며, 컴파일러를 사용하여 이를 수행합니다. 소스 코드를 컴파일하면 경고가 표시됩니다.

그러나 일반 인스턴스를 생성할 때 Java SE 7의 유형 유추는 제한적입니다. 생성자의 매개변수화된 유형이 컨텍스트에서 명시적으로 선언된 경우에만 유형 유추를 사용할 수 있습니다. 그렇지 않으면 작동하지 않습니다. 예: 다음 예제는 Java 7에서 올바르게 컴파일할 수 없습니다(그러나 제네릭 유형이 메소드 매개변수를 기반으로 자동으로 유추되므로 이제 Java 8에서 컴파일할 수 있습니다).

List<String> list = new ArrayList<>();
list.add("A");// 由于addAll期望获得Collection<? extends String>类型的参数,因此下面的语句无法通过
list.addAll(new ArrayList<>());

4. 개선 사항 Java 8의 일반 유형 추론

Java 8의 일반 대상 유형 추론에는 두 가지 주요 유형이 있습니다.

1. 메소드 컨텍스트를 통한 일반 대상 유형 추론 지원
2. 메소드 호출 링크에서 추론은 마지막 메소드로 전달됩니다
공식 홈페이지의 예를 살펴보겠습니다:

class List<E> {
   static <Z> List<Z> nil() { ... };
   static <Z> List<Z> cons(Z head, List<Z> tail) { ... };
   E head() { ... }
}

JEP101의 특성에 따라 위 메소드를 호출할 때 다음과 같이 작성할 수 있습니다.

//通过方法赋值的目标参数来自动推断泛型的类型
List<String> l = List.nil();
//而不是显示的指定类型
//List<String> l = List.<String>nil();
//通过前面方法参数类型推断泛型的类型
List.cons(42, List.nil());
//而不是显示的指定类型
//List.cons(42, List.<Integer>nil());

5. 요약

JEP101의 특징은 정적 언어의 대표로서 자바는 매우 풍부한 타입 시스템을 갖고 있다고 할 수 있다. 유형 간 변환 문제는 모든 Java 프로그래머의 고민거리입니다. 컴파일러를 통해 유형을 자동으로 유추하면 너무 복잡한 유형 변환 문제를 약간 완화할 수 있습니다. 비록 작은 개선이지만 매일 코드를 작성하는 우리 프로그래머들에게는 분명히 큰 영향을 미칠 것입니다. 적어도 그들은 더 행복해질 것입니다 ~~ 아마도 Java 9에서는 js 또는 Like some Dynamic과 같은 범용 유형 var를 얻게 될 것입니다. 스칼라 언어^_^

Java 8의 일반 대상 유형 추론 방법 개선과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.