2013-08-02 60 views
2

由於在下面的代碼中,R擴展了Appendable,所以我不應該能夠返回一個Appendable,其中R是預期的嗎?Java有界的通用協方差

/** 
    * Produces an R, to which a T has been semantically appended, 
    * whatever that may mean for the given type. 
    */ 
interface Appendable <R, T> 
{ 
    /** 
    * Append is not expected to modify this Appendable, 
    * but rather to return an R which is the result 
    * of the append. 
    */ 
    R append(T t); 
} 

interface PluralAppendable <R extends Appendable<R, T>, T> 
    extends Appendable<R, T> 
{ 
    default R append(T... els) 
    { 
     // Easier to debug than folding in a single statement 
     Appendable<R, T> result = this; 
     for(T t : els) 
      result = result.append(t); 

     /* Error: Incompatible types. 
      Required: R 
      Found: Appendable<R, T> */ 
     return result; 
    } 
} 
+0

如何在接口中定義方法,this代碼不能編譯。 – sanbhat

+0

因此,只需將它轉換爲'return(R)結果;'?好吧,我只是想確保我理解這個權利,而且演員陣容是有效的。 如果您的意思是將結果聲明爲R,如在'R result = this;'中那樣會引發一個「不兼容的類型:Required R,找到PluralAppendable ,這是有意義的,因爲PluralAppendable不擴展R,

+0

接口中的「default」修飾符和方法體在Java 8中可用,我正在使用 –

回答

5

由於在下面的代碼,R延伸可追加,我不應該能夠返回一個可追加,其中的R預期?

不,你不能。你只能這樣做,如果繼承是相反的。

但是,您可以垂頭喪氣resultR,使其編譯,但它會告訴你警告未經檢查的演員的。

return (R)result; 
3

正好相反。當你應該返回一個超類的引用時,你可以返回一個子類。在你的例子中,你嘗試做相反的事情,當然你需要一個R類型對象的引用。你不能將它的超類對象傳遞給R引用。