2013-03-08 2 views
17
은 우리가 나는 다음과 같은 클래스가 있다고 가정 해 봅시다

: 기본이 메서드에 전달

  • 동물
  • 고양이
  • 암소

동물이다 클래스, 고양이, 개, 암소는 각각 서브 클래스입니다. 이 위대한 작품을

private boolean addObject(Animal toAdd, Animal defVal, Set<? extends Animal> vals) 

, 내가 할 수있는 : 그들에서 작동하는 일반적인 기능을하는 것이 합리적 있도록

내가 지금하는 Set<Cat>, Set<Dog>Set<Cow> 이들 각각이 같은 방식으로 사용이 아무런 문제없이 자유롭게 내 세트를 지나친다.

문제가 나타납니다. 매개 변수 val에 Animal toAddress를 추가 할 수 없습니다. 검색 방법을 변경하면 다음과 같이 나타납니다.

private boolean addObject(Animal toAdd, Animal defVal, Set<? super Animal> vals) 

매개 변수 값에 동물을 추가 할 수 있습니다. 이 작품은, 지금을 제외하고는, 내 하위 집합의 고양이, 개, 소들을 전달할 수 없습니다. 문제가되는

private <T> boolean addObject(T toAdd, T defVal, Set<? super T> vals) 

, 나는 방법은 동물의 모두가 가지고 호출을 수행 할 수 있어야합니다 : 앞으로의 연구는 부팅없이 경고와 함께 다음 작품은, 나에게 알려줍니다. 이것은 간단한 캐스트를 사용하여 쉽게 얻을 수 있습니다.

((Animal)toAdd).getAnimalType() 

일반적인 기능을 유지할 수 있고 캐스팅 할 필요가 없으므로이 문제를 해결할 수있는 방법이 있습니까? 이 예제의 경우 기본 세트, 동물 세트의 모든 세트를 설정하는 것 외에?

+2

* 여기에 HTML 코드를 사용하지 않고 <> 사용할 수있는 방법이 있습니까? * => 예, 제 편집을 참조하십시오. SO에서 html을 사용할 필요가 거의 없습니다. – assylias

+2

+1 귀하의 이전 연구를 위해. 슬프게도이 사이트에서는 드문 일입니다. –

+0

@assylias 그 점에 대해 감사드립니다. 이제, 다음에 질문 할 필요가있을 때만 기억할 수 있다면. – Legowaffles

답변

13

좋은 연구 결과가 거의 나왔습니다. T에 상한을 추가하기 만하면됩니다.

private <T extends Animal> boolean addObject(T toAdd, T defVal, Set<? super T> vals) 
+1

감사합니다. 가능한 경우 8 분 안에 답변으로 표시하겠습니다. – Legowaffles

+0

이 방법의 서명이 의미하는 바를 설명하는 것이 유용 할 수 있습니다. 즉, "Animal"이나'Animal'의 하위 클래스 인'T'가'Cat'처럼 주어진다면,이 메소드는'T' 형과'T' 형 중 하나의'Set' 두 인수를 취합니다. ('Set '와 같은) 또는 'Set '와 같은 수퍼 타입 ​​인'T'의 수퍼 유형입니다. " '? 슈퍼'는'Set' 인수에서'Set '가 아닌''Set ''을 사용할 수 있도록 허용합니다. 그러나'Set '이 작동하지 않습니다. 왜냐하면'은'Animal' 또는'Animal'의 서브 클래스 인 어떤 타입을 의미합니다 * 그러나 어떤 서브 클래스인지는 알지 못합니다 *. " –