2014-05-20 3 views
-1

캐스팅하지 않고 함수에서 일반 데이터 형식을 반환하는 방법이 궁금합니다. 제네릭의 핵심은 콜렉션과 컴파일 타임 오류가 발생하여 캐스팅 할 필요성을 제거하는 것이 었습니다. 나는 또 다른 유형에서 캐스트를 수행하지 않고 타입 E를 반환 할 수Java Generics & Return Types

public E get(K key) 

, 예를 들어 :의 방법 그러나

이 서명을 말한다 return (E) "test";

제네릭 사용의 모든 목적을 달성하지 못합니까? 내가 여기서 무엇을 놓치고 있는지. E 타입의 변수를 반환하려면 어떻게해야합니까?

+2

예를 캐스팅없이 타입 E를 반환 할 수 있습니다, 예를 들면 : 다음은 샘플 코드입니다 'Map ':'return map.get (key);'. – sp00m

+0

어디에서이 함수를 사용했는지에 따라 유형이 컴파일 타임에 알려지고 자동으로 반환 형식이 E로 설정됩니다. –

+3

문자열을 반환하기 전에 String으로 캐스팅하면 클래스가 generic이 아니어야합니다. 문자열 만 반환 할 수 있습니다. –

답변

0

제네릭은 "템플릿"에 지정된 개체 클래스가 클래스 클래스 또는 메서드 자체에서 제공하는 기능과 아무런 관련이 없거나 거의없는 경우 클래스 및/또는 메서드의 재사용을 향상시키기위한 것입니다.

가장 좋은 예는 일반 유형이 검은 색 상자 인 데이터 구조입니다. 당신은 그들을 신경 쓰지 않고, 어떤 식 으로든 그것들을 모으는 것이 중요합니다.이 객체들을 어떻게 색인하고, 정렬하고, 찾거나, 트래버스하는지 ...입니다.

당신이 제안하고있는 경우 (return (E) "test";)는 당신이이 객체들 중 하나를 만들기 때문에 그 원칙에 위배됩니다. 왜냐하면 당신은 그 객체의 클래스 세부 사항을 알아야하기 때문입니다.

오브젝트 쌍을 표현하는 클래스를 제공한다고 가정하십시오. 이러한 객체의 특성에 대해 전혀 신경 쓰지 않고 객체 참조로 그룹화하는 방법을 제공하기 만하면됩니다.

public class Pair<T,S> { 

    public T getFirst() { 
     return first; 
    } 

    public void setFirst(T first) { 
     this.first = first; 
    } 

    public S getSecond() { 
     return second; 
    } 

    public void setSecond(S second) { 
     this.second = second; 
    } 

    private T first; 
    private S second; 
} 

쌍을 집계 넘어 first 또는 second와 아무 상관이있다 : 이것은 일반적인 유형의 사용의 전형적인 경우이다.

0

예 일반을 사용하여 할 수 있습니다.

public class Sample<E,K>{ 
Map<K, E> map = new HashMap(){{ 
    put("key", "value"); 
}}; 
public static void main(String[] args) { 
    Sample<String,String> sample = new Sample<String,String>(); 
    String val = sample.get("key"); 
    System.out.println(val); 
} 

public E get(K key) { 
    E e = map.get(key); 
    return e; 

} 
}