나는 현재 Java를 공부하고 있으며 최근에는 꺾쇠 괄호 (<>)로 인해 혼란에 빠졌습니다. 정확히 무엇을 의미합니까?
public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects = new ArrayList<T>(maxsize)
}
무슨 <T>
뜻입니까? 그것은 유형의 객체를 만들 수 있다는 것을 의미합니까 T
?
답변
<T>
은 일반적 이며 “T 유형”으로 읽을 수 있습니다. <>의 왼쪽에있는 유형이 실제로 의미하는 바에 따라 다릅니다.
나는 Pool
또는 무엇인지 PoolFactory
모르지만 ArrayList<T>
표준 Java 클래스 인을 언급 했으므로 이에 대해 이야기하겠습니다.
일반적으로 거기에 “T”가 표시되지 않고 다른 유형이 표시됩니다. 당신이 볼 그렇다면 ArrayList<Integer>
예를 들어, 그 수단 “는 ArrayList
의 Integer
의.” 예를 들어 많은 클래스는 제네릭을 사용하여 컨테이너의 요소 유형을 제한합니다. 또 다른 예는 HashMap<String, Integer>
” String
키와 Integer
값이 있는 맵”을 의미 합니다.
클래스를 정의 하고 있기 때문에 풀 예제는 약간 다릅니다 . 따라서이 경우 다른 사람이 T 대신 특정 유형으로 인스턴스화 할 수있는 클래스를 작성합니다. 예를 들어 Pool<String>
클래스 정의를 사용하여 유형의 오브젝트를 작성할 수 있습니다 . 그것은 두 가지를 의미합니다.
- 내이
Pool<String>
인터페이스 것이다PoolFactory<String>
A를createObject
반환하는 방법String
들. - 내부적 으로는의 문자열을
Pool<String>
포함합니다ArrayList
.
다른 소식으로, Pool<Integer>
같은 코드를 사용하지만 소스에서 Integer
볼 수 있는 곳을 가지고 생성 할 수 있기 때문에 이것은 좋은 소식 T
입니다.
답변
정말 간단합니다. J2SE 5에 도입 된 새로운 기능 입니다. 클래스 이름 뒤에 꺾쇠 괄호를 지정하면 모든 유형의 데이터를 보유 할 수있는 임시 데이터 유형을 작성한다는 의미입니다.
예:
class A<T>{
T obj;
void add(T obj){
this.obj=obj;
}
T get(){
return obj;
}
}
public class generics {
static<E> void print(E[] elements){
for(E element:elements){
System.out.println(element);
}
}
public static void main(String[] args) {
A<String> obj=new A<String>();
A<Integer> obj1=new A<Integer>();
obj.add("hello");
obj1.add(6);
System.out.println(obj.get());
System.out.println(obj1.get());
Integer[] arr={1,3,5,7};
print(arr);
}
}
대신 <T>
실제로 무엇이든 쓸 수 있으며 같은 방식으로 작동합니다. <ABC>
대신 쓰기 를 시도하십시오 <T>
.
이것은 단지 편의를위한 것입니다.
<T>
모든 유형이라고합니다<E>
요소 유형으로<N>
숫자 형으로<V>
가치로<K>
열쇠로
그러나 원하는 이름을 지정할 수 있지만 실제로는 중요하지 않습니다.
또한, Integer
, String
, Boolean
등 어떤 도움이 컴파일시 타입의 체크 자바의 래퍼 클래스입니다. 예를 들어 위의 코드에서 obj
유형 String
은이므로 다른 유형을 추가 할 수 없습니다 (시도 obj.add(1)
오류가 발생합니다). 마찬가지로 유형 obj1
의 Integer
유형이므로 다른 유형을 추가 할 수 없습니다 (시도 obj1.add("hello")
오류가있을 것입니다).
답변
Java의 제네릭과 관련이 있습니다. 내가 언급했다면 ArrayList<String>
StringType 객체 만 해당 ArrayList에 추가 할 수 있음을 의미합니다.
Java에서 제네릭의 두 가지 주요 이점은 다음과 같습니다.
- 프로그램의 캐스트 수를 줄여서 프로그램의 잠재적 버그 수를 줄입니다.
- 코드 선명도 향상
답변
제네릭 형식이라고합니다. 다음과 같이 객체 풀을 인스턴스화 할 수 있습니다.
PoolFactory<Integer> pool = new Pool<Integer>();
일반 매개 변수는 참조 유형 만 될 수 있습니다. 따라서 int 또는 double 또는 char 또는 기타 기본 유형과 같은 기본 유형을 사용할 수 없습니다.
답변
<>
Java에서 제네릭 을 나타내는 데 사용됩니다 .
T
이 예에서 유형 매개 변수입니다. 그리고 더 : 인스턴스화 당신이하는 몇 가지 중 하나입니다 수 와는 T
.
위에 링크 된 튜토리얼 외에 Angelika Langers Generics FAQ 는이 주제에 대한 훌륭한 자료입니다.
답변
일반 클래스는 데이터 유형을 작성할 때 매개 변수로 사용하는 클래스 유형입니다. 이 유형 매개 변수는 꺾쇠 괄호를 사용하여 지정되며 클래스의 새 인스턴스가 인스턴스화 될 때마다 유형이 변경 될 수 있습니다. 예를 들어 Employee 객체에 대한 ArrayList와 Company 객체에 대한 ArrayList를 만들어 보겠습니다.
ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();
우리는 동일한 ArrayList 클래스를 사용하여 두 목록을 모두 만들고 괄호를 사용하여 직원 또는 회사 유형을 전달합니다. 하나의 일반 클래스를 사용하면 여러 유형의 데이터를 처리 할 수 있으므로 유사한 작업을 수행하는 많은 클래스가 필요합니다. 제네릭은 또한 컴파일러에 오류를 지적하는 데 도움이되는 모든 유형을 강력한 형식으로 제공하여 버그를 줄입니다. ArrayList에 유형을 지정하면 직원을 회사 목록에 추가하려고하거나 그 반대의 경우에도 컴파일러에서 오류가 발생합니다.