Java : 란 무엇입니까 - 공개 정적 foo () {…}?
-
11-09-2019 - |
문제
나는 이와 같이 보이는 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();
}