2013-02-10 144 views
1

我將如何定義在Java中的F<T>F<T,U>F<T,U,V>接口(代替來自C#的Action,它們將具有返回void的一個,兩個和三個參數的函數)?如何在Java中定義F <T>和F <T,U>和F <T,U,V>接口?

當我嘗試將它們創建爲嵌套類型時,出現錯誤說「重複的嵌套類型F」,當我嘗試將它們創建爲頂級類型時,我必須將F<T>F<T,U>都放置在F. java的。

我可能可以通過將每個F放在單獨的包中來解決這個問題,但是我不喜歡這個解決方案,因爲我必須定義與我一樣多的通用參數。

同樣會去實現多種泛型參數的元組類等

代碼示例,不工作:

public interface F<T>{ 
    public void f(T arg1); 
} 

public interface F<T,U>{ 
    public void f(T arg1,U arg2); 
} 
+1

你能分享一個給出錯誤的代碼的例子嗎?我發現很難理解你想要做什麼。 – 2013-02-10 18:28:21

+0

難道你不想在方法級別定義泛型類型嗎? – assylias 2013-02-10 18:29:34

+0

@DuncanJones @DuncanJones - 看到編輯過的文章 – Axarydax 2013-02-10 18:30:31

回答

3

你不能用相同的接口名稱來做它。 Java會擦除參數化類型。

其他工具包的使用像F1 <牛逼>名做過類似的事情,F2 < T1,T2 >和F3 < T1,T2,T3 >。這有點冗長,但有效。

1

,我將不得不把兩個F和F F中的.java。

由於F被定義爲public(這可以被中省略)

也避免具有相同名稱的多個接口。這樣做從來沒有好的理由!

interface F<T,U,V>{ 
    public void f(T arg1); 
    public void f(T arg1, U arg2, V arg3); 
    public void f(T arg1, U arg2); 
} 

public class TryTest<T,U,V> implements F<T,U,V>{ 
    public void f(T arg1, U arg2){ } 
    public void f(T arg1) { } 
    public void f(T arg1, U arg2, V arg3) { } 
    public static void main(String[] args) { 
     System.out.println("Works!"); 
    } 
} 
+1

它會工作,但每當我想使用這個接口,我會實施所有這些方法。與C#lambda方法相比,實現一個接口來傳遞某些動作已經太麻煩了,但是每次都必須實現3個或更多的方法將會太多: – Axarydax 2013-02-10 18:41:54

+0

如果使用IDE,IDE會自動爲您插入它們你聲明'implements' :-)。 Java只是不允許像C#那樣的泛型的默認參數化。 C#是一種更先進的語言。 – 2013-02-10 18:43:02

+0

我意識到這一點,並非常感謝Eclipse這樣做,我只是討厭在C#中需要1行的東西需要5個Java中的這個。但是,直到Java引入lambda表達式之前,我們必須爲之而活。 – Axarydax 2013-02-10 18:48:06

1

問題是你不能有兩個同名的接口。泛型(原始類型)在編譯期間不使用,因此編譯器不會區分它們。

1

在Java中,泛型類型具有固定數量的類型參數。因此,如果您需要不同數量的參數,則需要不同類型:

interface F1<T> { 
    void f(T arg); 
} 

interface F2<T, U> { 
    void f(T t, U u); 
} 

等等。

相關問題