2014-04-02 143 views
1

我無法理解與泛型相關的子類型/接口實現背後的概念。請解釋。 我有以下結構:泛型在泛型和實現類中的paraemeterised定義理由

`ICommand -> ProducerConsumerCommand` 

IProducerConsumer -> SimpleProducerConsumer 

我的理解是,實施IProducerConsumer任何具體的類必須持有類型T是數量和ICommand接口的子類的對象。

IProducerConsumer<T extends Number,ICommand>

現在我想寫一個實現類SimpleProducerConsumer,

現在,我的意圖是,我想告訴大家,SimpleProducerConsumer可以容納任何類型的參數,在IProducerConsumer類型參數,定義如下:

public class SimpleProducerConsumer<T,ICommand> implements Runnable, 
     IProducerConsumer<T,ICommand> { 

忽略了最低的工作,它說如下:

SimpleProducerConsumer<T,ICommand> - ICommand complains (warning) that it is getting hidden. 
IProducerConsumer<T,ICommand> - compiler errors in T saying as below 

*約束不匹配:類型T不是類型IProducerConsumer<T,ICommand>*

的有界參數的有效替代品所以,我的第一個問題是,爲什麼我不能定義方式在具體的類接口相同。 引擎蓋下發生了什麼。

,如果我可以定義

public class test<ICommand> {} 

我爲什麼不能做同樣的同時實施,令人目不暇接。

現在我定義如下

public class SimpleProducerConsumer<T,ProducerConsumerCommand> implements Runnable, 
     IProducerConsumer<T,ICommand> { 

仍然噸IProducerConsumer抱怨。

如果我改變如下:

public class SimpleProducerConsumer<T,ProducerConsumerCommand> implements Runnable, 
     IProducerConsumer<T extends Number,ICommand> { 

延伸抱怨說,除去令牌。

我現在這樣的,如下:

public class SimpleProducerConsumer<T extends Number,ProducerConsumerCommand> implements Runnable, 
     IProducerConsumer<T extends Number,ICommand> { 

在IProducerConsumer這麼想的工作還延伸。

現在

public class SimpleProducerConsumer<T extends Number,ProducerConsumerCommand> implements Runnable, 
     IProducerConsumer<T,ICommand> { 

是現在的編譯器是幸福的。現在我完全失去了,上面的東西是什麼意思。 SimpleProducerConsumer包含T類型的對象,它們是Number的子類,ProducerCommand對象是有意義的,但IProducerConsumer保存類型T的對象?這是什麼 ?

這是什麼原因。有人可以請expalin。

回答

1

您這裏有兩個問題:

  1. 因爲它現在宣佈IProducerConsumer<T extends Number,ICommand>ICommand沒有引用您的ICommand界面,但不是隻是一個泛型類型參數聲明類似T。因此,您會收到警告,該通用類型參數隱藏了您的界面。您必須聲明你的IProducerConsumer像這樣:

    public interface IProducerConsumer<N extends Number, C extends ICommand> 
    
  2. 你得到一個Bound mismatchT,因爲T不一定延長Number,所要求的IProducerConsumer接口。爲了解決這個問題,則必須聲明SimpleProducerConsumer像這樣:

    public class SimpleProducerConsumer<N extends Number, C extends ICommand> implements Runnable, IProducerConsumer<N,C> 
    
我不清楚在上述第1點的術語你說的泛型類型參數
+0

嗨巴爾德第一件事,是不是泛型類型參數或通用類型參數。因爲從下面的鏈接泛型類型參數是調用類型參數時發生的.http://docs.oracle.com/javase/tutorial/java/generics/types.html – Curious

+0

好點 - 這是一個錯字。 'ICommand'實際上是一個類型參數聲明。我編輯了我的答案 – Balder

+0

謝謝巴爾德現在我明白了。這意味着類型參數是一個聲明,它聲明它擁有某種類型的對象,但是由於ICommand是一種類型的接口,它根本不具有任何意義,所以就通用術語而言,我們必須指定它,因爲它可以容納任何對象一些具體類型或C類型,它擴展了作爲接口的類型參數。這說得通。謝謝。糾正我如果我的翻譯有缺陷。 – Curious