2012-10-15 3 views
2
class Animal{} 
class Dog extends Animal{} 
class Cat extends Animal{} 
public class Mixer<A extends Animal>{ 
    public <C extends Cat> Mixer<? super Dog> useMe(A a, C c){ 
     //return new Mixer<Object>();//KO 
     return new Mixer<Animal>(); //OK 
    } 
} 

반환 매개 변수는 너무 Mixer<? super Dog>입니다 Mixer<Animal>?는 <? super Dog>

+0

당신이 재 수를 귀하의 질문 문구를? 당신이 무엇을 요구하는지 명확하지 않습니다. –

+1

@RohitJain : 그는'Mixer '을 돌려 주겠다고 말했지만'Mixer '이 아닌 이유는 무엇입니까? –

+0

나는이 책의 답을 이미 가지고 있지만 의심의 여지가 없다. 메서드의 반환 유형이 Mixer 이므로 Dog의 수퍼 유형 또는 Dog의 수식 유형 인 Mixer 객체를 의미합니다. 그러나이 경우 Object는 상위 유형이며 컴파일러 오류가 있습니다. – Joe

답변

6

문제가 메서드의 반환 형식이 아니며 에 바인딩 된 Generic Type입니다.

는의가 무엇이 잘못되었는지 보자 : -

public <C extends Cat> Mixer<? super Dog> useMe(A a, C c) 

반환 형식 Mixer<? super Dog> 수단을, 당신은 유형 DogMixer 또는 개의 super-type을 반환 할 수 있습니다, Animal을 할 수있다. 모두 AnimalObjectDogsuper-type입니다 때문에

//return new Mixer<Object>();//KO 
    return new Mixer<Animal>(); //OK 

그래서, 모두 return 문에서도 잘 작동 것입니다.

그러나, first one하지, 때문에 당신이로 클래스를 선언한다에에 맞는 않는 이유 : - 그래서

public class Mixer<A extends Animal> 

, 당신은 boundMixer과 연관 될 수 있습니다 type 클래스를 Animal 또는 subtype 중 하나에 지정하십시오. ObjectAnimal의 하위 아니라, 이후 지금, 당신은 만들 수 없습니다 : - 그래서

new Mixer<Object>(); 

, 당신은 같은 클래스의 인스턴스 생성 할 수 있습니다 : -

new Mixer<Animal>(); // OR 
new Mixer<Dog>(); // Dog extends Animal // OR 
new Mixer<Cat>(); // Cat extends Animal 

// **** But NOT like this ****** 
new Mixer<Object>(); // Object does not extend Animal 
+0

고마워요 @rohitjahin – Joe

+0

@Joe. 천만에요 :) –