2012-02-29 1 views
0

저는 Java Generics를 처음 사용합니다. 그러나 저는 많은 요약 링크와 예제를 읽었습니다. 그러나 나는 가장 간단한 방법을 알 권리가 없다. 나는 somenoe가 도울 수 있기를 바란다 :Java Generics로 안전하지 않은 경고 경고를 피하는 방법

정의되지 않은 Object 하나를 다른 Object에 매핑하는 HashMap을 만들고 싶습니다. 두 객체 모두 String 또는 Integer 중 하나 일 수 있습니다.

그래서 내가 쓴 :

private final HashMap<L, R> left2Right = new HashMap<L, R>(); 

Extractor<?> extLeft = Extractor.getInstance(0); 
Extractor<?> extRight = Extractor.getInstance(1); 

L leftVal = extLeft.extract(d, i); 
R rightVal = extRight.extract(d, i); 

this.left2Right.put(leftVal, rightVal); 

지금까지 너무 좋아 ...하지만 추출기 - 객체를 구현하는 문제가있다. 그들은 공장 패턴에 의해 인스턴스화됩니다.

abstract class Extractor<E> { 
    abstract E extract(DTable source, int row); 

    static <E> Extractor<E> getInstance(int type) { 
     if(type == 0) 
      return new IntExtractor(); 
     else 
      return new StringExtractor(); 
    } 
} 

class IntExtractor extends Extractor<Integer> { 

    @Override 
    Integer extract(DTable source, int row) { 
     int value = 5; 
     return new Integer(value); 
    } 

} 

class StringExtractor extends Extractor<String> { 

    @Override 
    String extract(DTable source, int row) { 
     String retVal = "hello"; 
     return retVal; 
    } 

} 

그것은 컴파일하지만 나는 내가 뭘 잘못 E.로 정수/문자열 캐스팅에 Unsave 캐스트 경고를 얻을 : 나는 다음과 같이했다 (simplyfied)? 나도 알아, 나는 단순히 경고를 억누를 수있다. 하지만 이것이 바로 Java generics의 장점이라고 생각했습니다. 'E'가 실제로 "..."어떤 유형인지는 알지 못하기 때문에이 캐스팅 저장을 할 수 없습니다 ...

아니면 기본적으로 잘못된 것을하고 있습니까?

참고 : 나는 첫 번째 대답에서 몇 가지 정보를 사용 후 나는 "새로운"질문에 내 코드를 편집 ...

+0

난 당신이 모든 것을이 문제가 우리에게 말하고되지 않은 느낌이 할 ... – Bombe

답변

0
모두 P

E이없는 것처럼 보인다는 추출기의 입력에 사용되는 왜 너는 그들도 가지고 있니? intString을 반환하고 처리하십시오.

2

추출기는 실제로 전혀 일반적인 것이 아닙니다.

public interface Extractor<P> { 
    P extract(DTable source, int row); 
} 

하지만 비 제네릭 구현합니다 : 그것은 당신이 뭔가를 원하는 같은 소리

IntExtractor<String> extractor = new IntExtractor<String>(); 
String x = extractor.extract(...); 
:

class IntExtractor implements Extractor<Integer> { 

    Integer extract(DTable source, int row) { 
     int value = 5; 
     return new Integer(value); 
    } 
} 

기본적으로 현재 코드는 점에서 내가 쓸 수, 고장

... 분명히 실패하지만 실행 시간에만 발생합니다.

+0

좋아요 ... 나는 모든 것을 게시하지 않았다. 인터페이스 대신 다음과 같은 추상 클래스를 사용하고 있습니다. – Sauer

+0

@Sauer : 주석에 코드를 넣는 대신 질문을 편집해야하지만 동일한 원칙이 적용됩니다. 구체적인 클래스는 generic 클래스를 하위 클래스로 분류하더라도 일반 클래스가 아닙니다. –

1

나는 기본적으로 잘못된 것을하고 있다고 말하고 싶습니다. IntExtractor 및 StringExtractor 인 경우 제네릭이 필요하지 않습니다. 그냥 방법

Integer extract(DTable source, int row) 

String extract(DTable source, int row) 
1

을 정의하는 문제는 당 자체 코드가 없습니다. 안전하지 않은 캐스팅 없이는 작업 자체를 해결할 수 없습니다. 다시 자신의 문장을 읽기 : 내가 다른 한 정의되지 않은 개체 매핑의 HashMap를 작성하려는

. 두 객체 모두 String 또는 Integer 중 하나 일 수 있습니다.

Java Generics는 사전에 유형을 알아야하기 때문에이 문제를 해결할 수 없습니다. 그렇지 않으면 캐스팅해야합니다.

하는 것은 솔직히 말해서, 난 당신이 게시 된 코드를 달성하기 위해 원하는 것을 모른다, 그러나 당신이의 HashMap을 사용하려면, 당신은 이런 식으로 작업을 수행 할 수 있습니다이 경우

private final HashMap<String, Integer> left2Right = new HashMap<String, Integer>(); 
left2Right.put("one", 1); 
int numberOne = left2Right.get("one"); 

당신 HashMap에는 String 키와 Integer 값이 있기 때문에 값을 캐스팅 할 필요가 없습니다. 다른 유형을 값으로 넣으려면 모든 값의 4 퍼 유형을 사용해야합니다. 이 수퍼 유형은 계층 구조의 루트 인 Object 일 수 있습니다. 그러나 어떤 경우에는 그 가치가 무엇인지 알지 못하기 때문에 캐스팅해야합니다.

private final HashMap<String, Integer> left2Right = new HashMap<String, Object>(); 
    left2Right.put("one", 1); 
    left2Right.put("two", new Date()); 
    // Because the compiler cannot know that type "one" might be, this isn't allowed and  you have to cast the value. It might be anything - in this example Date or Integer. 
    int numberOne = left2Right.get("one"); 

도움이 되었기를 바랍니다.