[java] Java에서 <T> (각괄호)는 무엇을 의미합니까?

나는 현재 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>예를 들어, 그 수단 “는 ArrayListInteger의.” 예를 들어 많은 클래스는 제네릭을 사용하여 컨테이너의 요소 유형을 제한합니다. 또 다른 예는 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)오류가 발생합니다). 마찬가지로 유형 obj1Integer유형이므로 다른 유형을 추가 할 수 없습니다 (시도 obj1.add("hello")오류가있을 것입니다).


답변

Java의 제네릭과 관련이 있습니다. 내가 언급했다면 ArrayList<String>StringType 객체 만 해당 ArrayList에 추가 할 수 있음을 의미합니다.

Java에서 제네릭의 두 가지 주요 이점은 다음과 같습니다.

  1. 프로그램의 캐스트 수를 줄여서 프로그램의 잠재적 버그 수를 줄입니다.
  2. 코드 선명도 향상

답변

제네릭 형식이라고합니다. 다음과 같이 객체 풀을 인스턴스화 할 수 있습니다.

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에 유형을 지정하면 직원을 회사 목록에 추가하려고하거나 그 반대의 경우에도 컴파일러에서 오류가 발생합니다.


답변