2013-04-08 204 views
3

這是現有的接口:一個接口有兩個類型參數。我可以使用兩種類型的接口來實現接口嗎,這樣它們就可以兼容了嗎?

public interface MyInterface<T, U> { 
    public T foo(U u); 
} 

我要實現的假設,即T和U是同一類型下的這個接口。我想也許我可以離開,因爲他們是類型參數,然後只要我只實例化這個特定的實現有兩個同一類型的,它可能工作:

public class MyOuterClass<A> { 

    public class MyClass<T, U> implements MyInterface<T, U> { 

     @Override 
     public T foo(U u) { 
      return u; //error here 
    } 

    //even though in the only instantiation of MyClass, T and U are the same 
    private MyClass<A, A> myInstance = new MyClass<A, A>(); 

} 

但是,也許並不奇怪,這不起作用,因爲類型T和U不兼容。

所以我想也許我可以改變MyClass來指定它的類型總是相同的,通過改變它類似MyClass<A, A> implements MyInterface<A, A>或類似的東西,但我得到的錯誤說T已經定義。

有沒有辦法實現MyClass,使它的兩種類型是相同的?

(我更多的是C++的傢伙比Java的,很抱歉,如果我錯過了Java的泛型東西在這裏根本。)

+0

您正在使用兩種不同類型的參數;編譯器無法弄清楚你的意圖,因爲如果它們的目的是爲相同的類型,你應該說'MyClass '而不是'MyClass '。 – 2013-04-08 16:34:27

回答

2

你MyClass的需要是這樣的:

public class MyClass<T> implements MyInterface<T, T> { 

    @Override 
    public T foo(T in) { 
     return in; 
    } 
} 

讓我們回顧一下您的建議類的定義做了什麼:

public class MyClass<T, U> implements MyInterface<T, U> 

在這段代碼,TU兩件事每個:

  • 在第一次出現它們在第二次數定義MyClass
  • 的類型變量它們指定具體類型的MyInterface

的自的主體內的類TU是無限類型變量(即沒有關於實際類型的信息),它們被認爲是不兼容的。

通過在MyClass中只有一個類型變量,您可以明確地假設:只有一種類型,並且我將它用於這兩種類型的接口。

最後但並非最不重要:請記住一旦源完全處理,編譯的類型爲完成。換句話說:與C++相反,泛型類型的「實例化」(C++中的「模板類型」或類似;對於我生鏽的術語抱歉)不是句柄。就JVM而言,MyClass<Foo>MyClass<Bar>是相同的類型(只有編譯器實際上將它們區分開來)。

1

定義MyClass單一類型的參數:

class MyOuterClass<A> { 

    public class MyClass<T> implements MyInterface<T, T> { 

     public T foo(T u) { 
      return u; 
     } 
    } 

    // Need only one 'A' here. 
    private MyClass<A> myInstance = new MyClass<A>(); 

} 

當你說

public class MyClass<T> implements MyInterface<T, T> { 

...要定義MyClass一個通用的變量,你說的話,它可以同時滿足TUMyInterface中的角色。

相關問題