문제

나는 이와 같이 보이는 Java 기능을 보았다.

public static<T> foo() {...}

나는 제네릭이 무엇인지 알고 있지만 누군가이 맥락에서 누군가를 설명 할 수 있습니까? 누가 동등한 지 결정합니까? 여기서 무슨 일이야?

편집 : 누군가가 이와 같은 기능의 예를 보여줄 수 있습니까?

도움이 되었습니까?

해결책

반환 유형을 놓쳤지만 그 외에는 일반적인 방법입니다. 일반적인 유형과 마찬가지로 T 모든 참조 유형에 대해 서 있습니다 (주어진 경우 경계 내에).

방법의 경우, 일반 파라미터는 일반적으로 컴파일러에 의해 추론됩니다. 특정 상황에서는 약간 독특한 구문을 사용하여 일반적인 인수를 직접 지정할 수 있습니다.

    List<String> strings = Collections.<String>emptyList();

이 경우 컴파일러는 유형을 유추 할 수 있었지만 컴파일러가 할 수 있는지 여부는 항상 분명하지 않습니다. 참고, <> 도트 뒤에 있습니다. 구문의 이유로 유형 이름 또는 대상 객체를 항상 지정해야합니다.

일반적인 생성자를 가질 수는 있지만 야생에서는 한 번도 본 적이 없으며 구문이 악화됩니다.

C ++ 및 C# 구문이 메소드/기능 이름에 일반 유형을 배치한다고 생각합니다.

다른 팁

컨텍스트는 클래스와 달리 일반적인 방법입니다. 변수 <T> 방법의 호출에만 적용됩니다. 컬렉션 클래스에는 여러 가지가 있습니다. 클래스 자체는 일반적이지 않지만 많은 방법이 있습니다.

컴파일러는 t가 무엇인지 결정합니다. 때때로 이것은 다른 사람들보다 쉽습니다.

예를 들어, 메소드 static <T> Set<T> Collections.singleton(T o) 유형은 매개 변수에 정의되어 있습니다.

Collections.singleton(String T)

반환합니다 Set<String>.

때로는 유형이 정의하기 어렵습니다. 예를 들어 때로는 입력하기에 쉽게 정보가 충분하지 않습니다. Collection.emptyList(). 이 경우 유형을 직접 지정할 수 있습니다. Collection.<String>emptyList().

t 공식 유형 매개 변수는 객체의 인스턴스화에 사용 된 실제 유형 인수로 대체됩니다.

예를 들어, 여기에 package java.util의 목록 및 반복자 정의가 있습니다.

public interface List<E>{
  void add(E x);
  Iterator<E> iterator();
}

public interface Iterator<E>{
  E next();
  boolean hasNext();
}

그런 다음이 방법으로 목록을 인스턴스화 할 수 있습니다.

List<String> ls = new ArrayList<String>()

이 목록이 e가 문자열로 균일하게 대체 된 목록 버전을 상상할 수있는 곳.

public interface StringList{
  void add(String x)
  Iterator<String> iterator();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top