2012-10-27 4 views
2

자바로 제네릭 클래스를 작성하려고합니다. 이 클래스의 몇 가지 메소드에는 T extends Comparable<T>이 필요합니다. T은 그러한 방법 중 하나를 사용하는 경우에만 비교할 수 있어야합니다. 아니면 수업을 구성해야하는 다른 방법이 있을까요?`T extends Comparable <T>`특정 메소드에 대해서만 사용하십시오.

다음은 구현하려는 클래스입니다. 필자와 필자가 비교할 수있는 유형과 비교할 수없는 유형 모두에서 사용할 계획이다.

// I know Java has its own containers, but this 
// is homework and I'm not allowed to use them 
class Array<T> 
{ 
    // Some methods that pose no 
    // special restrictions on T 

    // These require that T be comparable 
    public Array<T> union(...) {...} 
    public Array<T> intersect(...) {...} 
} 
+0

당신이하고 싶은 일을 보여줄 수 있다면 정말 도움이 될 것입니다. –

+0

공용체와 교차점에는 Comparable이 필요하지 않으며 단지 equals()가 필요합니다. – ignis

+0

@ignis 목록이 정렬 된 것으로 가정하고 결과도 정렬되기를 원하면 비교가 필요합니다. –

답변

3

메서드에 대해서는 T을 숨길 수 있습니다. TTest 인 경우 TCompareMethod과 같지 않습니다.

public static class Test<T> { 
    <T extends Comparable<T>> void compareMethod(T t, Class<T> classt) { 
    } 
    void normalMethod(T t) { 
    } 
} 

지금 예를

업데이트
Test<String> test = new Test<String>();//Comparable class 
    test.compareMethod("",String.class);//works fine 
    Test<Random> tes1t = new Test<Random>();//Non Comparable class 
    tes1t.compareMethod(new Random(),Random.class);//Compilation error here 
    tes1t.normalMethod(new Random());//Works fine 
    new Test<Random>().compareMethod("",String.class);// Not a good but can be valid 
new Test<String>().compareMethod(new Random(),Random.class);//Compilation error here 

:

내가 자바 API의 일부 검색을 한이 솔루션에 대한 저주 된 후

이 연습은 toArray() 방법에 대한 다음됩니다

ArrayList<String> string = new ArrayList<String>(); 
string.toArray(new Integer[5]);<--Illegal however <T> is hide by toArray method 
+0

안전하지 않은 캐스팅 만 포함됩니까? – Antimony

+0

@Antimony 컴파일러가 없습니다. –

+3

compareMethod의 T가 Test of T가 아니라는 것을 명확히하십시오. 따라서 새로운 테스트 () .compareMethod (새 임의())를 가질 수 있습니다. – ignis

2

편집 : 결국은 가능합니다 (AmitD의 게시물 참조). 어쨌든, 다른 가능한 솔루션은

  1. 리팩터링에게
  2. 그냥 사용 그 부분은 런타임에 확인됩니다 것을 의미, 관련 방법에 캐스트 서브 클래스에 필적 요구하는 방법이 있습니다.
1

가능하지 않습니다. comparable를 사용하는 것과 같은 일반적인 방법을 통해.

정확한 요구 사항을 공유하는 것이 좋습니다.

ArrayList/배열의 정렬이 목표 인 경우 비표준 클래스 비교는 쓸모가 없습니다. 정렬 작업은 같은 유형 또는 하위 유형의 객체에서만 수행 할 수 있습니다.

그러나 객체가 같거나 다른지 비교를 위해 비교를 사용하려는 경우 equals (Object O) 메소드를 재정의 할 것을 제안합니다.

관련 문제