2013-04-08 1 views
-1

궁금합니다. 나는 class OccList<T>입니다. 어떤 오브젝트를 보유하고있는 OccList는 괜찮지 만, T가 String이거나 T가 정수 인 경우 더 많은 작업을 수행하려고합니다.특정 유형의 제네릭을 사용하여 클래스 확장하기

동일한 이름을 사용할 수있는 방법이 있습니까? 지금까지의 나의 해결책은 새로운 클래스 class StringOccList extends OccList<String>을 만드는 것이다. 최적으로 나는 OccList<String>을 사용할 수 있고 자바가 메서드 서명과 마찬가지로 사용되는 유형에 따라 적절한 클래스를 만들도록하고 싶습니다. 가능한가? 더 나은 해결책이 있습니까?

+1

클래스를 제네릭 화해야하는 이유가 있습니까? 오버로드 된 메소드를 제공하는 것만으로는 충분하지 않은 경우도 있습니다. – Perception

+0

""Java가 사용 된 유형에 따라 적절한 클래스를 생성하도록합시다. "- 나는 이것이 실제로 가능하다고 생각하지 않습니다. 어떤 변수를 인스턴스화하는 하위 클래스는 컴파일러가 결정할 항목이 아닙니다. – millimoose

+0

@millimoose, 무슨 뜻인지 이해하면 가능하다고 생각합니다. 제 응답의 예제를 참조하십시오 –

답변

-1

예, Java가 유형을 추측하는 한 곳을 사용할 수 있습니다. 즉, 메소드가 리턴합니다. 당신이 StringOccList을 원하는 상상,하지만 당신은 그럼이

OccList<String> list = new OccList<String>(); 

싶지 않아, 당신은 그냥 할 수있는 방법을 씁니다. 이 같은

public static <E> OccList<E> newOccList(){ 
    return new OccList(); 
} 

하고 호출 :이처럼

OccList<String> stringList = newOccList(); 
OccList<Integer> integerList = newOccList(); 
OccList<File> fileList = newOccList(); 

그것은 당신이 필요로하는 모든 제네릭 형식을 위해 일 것입니다.

이는 구글 구아바 라이브러리에서 사용되는, 그것은 here

+0

'Occ리스트 list = new OccList <>();'는 OP 추론이 수행하는 Java 7 단축키입니다 (http://ideone.com/AmPwiu). 에 대한. – millimoose

+0

팩토리 메서드로 사용하지 않으면 도움이되지 않는 것 같습니다. 예를 들어'newOccList (Object obj)'그리고 나서 obj의 클래스에 따라 적절한 객체를 생성할까요? –

+0

예, 귀하의 질문에 대한 오해가 있다고 생각합니다. 당신의 문제에서 가장 간단한 해결책은 팩토리 메서드가 될 것이므로 인스턴스를 직접 제어 할 수 있습니다. –

0

그것은 당신이 추가 된 기능은 기본 클래스의 일부가 될하지 않으려면, 다른 클래스이어야를 참조하십시오.

생각해보십시오. 목록의 모든 내용에 System.out.println을 호출하는 방법 printAll이 있다고 가정 해 보겠습니다. 방법은 어디로 갈 것입니까?

  1. String 인 경우에만 메소드를 호출 할 수 있습니다. 그렇다면 이 기본 클래스의 일부가 아니기 때문에 기본 클래스에 정의되어 있으므로 StringOccList
  2. 과 같은 다른 클래스를 사용해야합니다. 기본 클래스에서 메서드를 호출 할 수 있으면 괜찮습니다. 모든 멤버에서 (String의 경우) T.toString을 호출하도록 작성하거나 T가 적절한 유형이 아닌 경우 예외를 throw 할 수 있습니다.

"일반적인"의미는 클래스가 모든 종류의 내부 유형에서 작동한다는 것입니다. 그것은 어떤 종류의 내부 유형에 대해 작동하지 않는다면, 그것은 더 이상 일반적이지 않습니다!

+0

네, 이해 합니다만, 어떻게 든 오버로드 할 수 있는지 궁금 해서요, 마치'foo (String)'과'foo (정수)'메소드를 호출합니다. 나는 그렇지 않다! –

+0

그럼'foo (T)'를 확실히 할 수 있고 T가 기본 클래스에 기반을 둔 기능을 구현할 수 있습니다 ... – durron597

+0

Can I? T가 무엇인지 알아낼 방법이 있습니까? 예를 들어,'T.getClass()'나 instanceof 등을 할 수없는 것처럼 보였기 때문에. –