2012-10-15 47 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>所以如果用下界通配符一般用下界通配符<? super Dog>

爲什麼我有一個編譯器錯誤定義的,當我返回一個Mixer<Object>並沒有編譯器錯誤與Mixer<Animal>

+0

你能重新說出你的問題?它不清楚你在問什麼。 –

+1

@RohitJain:他說要回來'混音器'是允許的,但不是'混音器'爲什麼? –

+0

我已經有這本書的答案,但它並沒有明確表示我的懷疑。 它說因爲方法的返回類型是混音器,這意味着一個Mixer對象的泛型類型是Dog或Dog的超類型。但是在這種情況下,Object是一個超類型,並且存在編譯器錯誤。 – Joe

回答

6

問題不在於你的方法的返回類型,而是它綁定到你的類MixerGeneric Type

讓我們來看看什麼地方出了錯: -

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

返回類型Mixer<? super Dog>手段,你可以返回Dog類型的任何Mixer或狗的super-type,可能是Animal

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

所以,無論是return statments 會工作得很好,因爲,無論是AnimalObjectDog一個super-type

爲什麼first one不會是因爲你已經宣佈你的類爲符合的原因: -

public class Mixer<A extends Animal> 

所以,你必須boundtype可與Mixer相關分類爲Animalsubtype。 現在,因爲Object不是Animal一個亞型,你不能只是創建: -

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。別客氣 :) –