일반 유형은 유형에 대해 매개 변수화 된 일반 클래스 또는 인터페이스입니다. 다음 Box 클래스는 개념을 보여주기 위해 수정됩니다.
간단한 상자 클래스
모든 유형의 개체에서 작동하는 비 제네릭 Box 클래스를 검사하여 시작합니다. 상자에 객체를 추가하는 set과 객체를 검색하는 get의 두 가지 메소드 만 제공하면됩니다.
그 메소드가 Object를 수락하거나 반환하므로 원하는대로 자유롭게 전달할 수 있습니다. , 기본 유형 중 하나가 아닌 경우. 컴파일 타임에 클래스가 어떻게 사용되는지 확인할 방법이 없습니다. 코드의 한 부분은 Integer를 상자에 넣고 Integers를 가져올 것으로 예상하는 반면 코드의 다른 부분은 실수로 String을 전달하여 런타임 오류가 발생할 수 있습니다.
A Generic Version 박스 클래스의
일반 클래스는 다음 형식으로 정의됩니다.
class name<T1, T2, ..., Tn> { /* ... */ }
제네릭을 사용하는 Box 클래스, “public class Box”코드를 “public class Box < T > “. 이것은 클래스 내부 어디에서나 사용할 수있는 유형 변수 T를 소개합니다.
이 변경으로 Box 클래스는 다음과 같이됩니다.
보시다시피 Object의 모든 발생은 다음과 같습니다. T로 대체됩니다. 유형 변수는 모든 클래스 유형, 인터페이스 유형, 배열 유형 또는 다른 유형 변수와 같이 사용자가 지정하는 기본이 아닌 유형일 수 있습니다.
이 동일한 기술을 적용하여 생성 할 수 있습니다. 일반 인터페이스
유형 매개 변수 이름 지정 규칙
관례에 따라 유형 매개 변수 이름은 단일 대문자입니다. 이것은 이미 알고있는 변수 명명 규칙과 뚜렷한 대조를 이루며 그럴만한 이유가 있습니다.이 규칙이 없으면 유형 변수와 일반 클래스 또는 인터페이스 이름의 차이를 구분하기 어려울 것입니다.
가장 일반적으로 사용되는 유형 매개 변수 이름은 다음과 같습니다.
- E-요소 (Java Collections Framework에서 광범위하게 사용됨)
- K-키
- N-숫자
- T-유형
- V-값
- S, U, V 등-2 차, 3 차, 4 차 유형
Java SE API와이 단원의 나머지 부분에서 이러한 이름이 사용되는 것을 볼 수 있습니다.
일반 유형 호출 및 인스턴스화
일반 Box 클래스 참조 코드 내에서 T를 Integer와 같은 구체적인 값으로 대체하는 일반 유형 호출을 수행해야합니다.
Box<Integer> integerBox;
일반 유형 호출을 일반 메소드 호출과 유사하다고 생각할 수 있지만 am에 인수를 전달하는 대신 유형 인수 (이 경우 정수)를 Box 클래스 자체에 전달합니다.
다른 변수 선언과 마찬가지로이 코드는 실제로 새 Box 객체를 생성하지 않습니다. integerBox가 “Box of Integer”에 대한 참조를 보유한다고 선언하기 만하면 Box < Integer >를 읽는 방법입니다.
일반 유형의 호출은 일반적으로 매개 변수화 된 유형으로 알려져 있습니다.
이 클래스를 인스턴스화하려면 평소처럼 새 키워드를 사용하고 < 클래스 이름과 괄호 사이의 정수 > :
Box<Integer> integerBox = new Box<Integer>();
The Diamond
Java SE 7 이상에서는 일반 클래스의 생성자를 호출하는 데 필요한 유형 인수를 빈 유형 인수 집합 (< >) 컴파일러가 컨텍스트에서 유형 인수를 결정하거나 추론 할 수있는 한. 이 꺾쇠 괄호 쌍 < >는 비공식적으로 다이아몬드라고합니다. 예를 들어, 다음 문을 사용하여 Box < Integer > 인스턴스를 만들 수 있습니다.
Box<Integer> integerBox = new Box<>();
다이아몬드 표기법 및 유형 추론에 대한 자세한 내용은 유형 추론을 참조하세요.
다중 유형 매개 변수
앞서 언급했듯이 일반 클래스에는 여러 유형 매개 변수가있을 수 있습니다.예를 들어, 일반 Pair 인터페이스를 구현하는 일반 OrderedPair 클래스 :
다음 명령문은 OrderedPair 클래스의 두 인스턴스화를 만듭니다.
The code, new OrderedPair < String, Integer >는 K를 문자열로, V를 정수로 인스턴스화합니다. 따라서 OrderedPair의 생성자의 매개 변수 유형은 각각 String 및 Integer입니다. 오토 박싱으로 인해 String 및 int를 클래스에 전달하는 것이 유효합니다.
The Diamond에서 언급했듯이 Java 컴파일러는 OrderedPair < String, Integer > 선언에서 K 및 V 유형을 추론 할 수 있습니다. 이러한 명령문은 다이아몬드 표기법을 사용하여 단축 할 수 있습니다.
OrderedPair<String, Integer> p1 = new OrderedPair<>("Even", 8);OrderedPair<String, String> p2 = new OrderedPair<>("hello", "world");
일반 인터페이스를 만들려면 일반 클래스를 만들 때와 동일한 규칙을 따르세요.
매개 변수화 된 유형
OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...));