2016-02-02 32 views
0

我是一個java新手,我有一些像下面的代碼。java通用類型推斷

public interface TestJava<T extends MyClass, U> { 
    public U func(T t); 
} 

的問題是,Ü完全依賴於Ť使得如果Ť被確定,ü還確定(聲明Ú是不必要!)。作爲一個例子,如果Ť字符串,然後ü必須整數,並且不能是其它的。在C++ü可以容易地使用關鍵字的typedef像下面如果Ť是一個用戶定義的類除去。

class UserDefinedClass { 
public: 
    typedef int ReturnType; 
}; 

template<class T> class TestCpp { 
    T::ReturnType func(T t); 
}; 

但是,java沒有這樣的關鍵字(據我所知),所以我不知道如何實現這一點。 注意T中的java代碼是用戶自定義的對象,不是字符串,整數或其他。 不要混淆這個例子:)

+2

沒有通用的方法來實現這樣的約束。我可能會建議定義'接口TestJavaStringToInteger擴展TestJava (obv,名稱更好......),它有一個方法'Integer func(String t)';然而,沒有任何東西可以阻止你擁有另外一個'擴展TestJava '的接口。 –

回答

0

你可以做的一件事就是通過擴展接口來隱藏眼睛,然後再調用擴展接口。這裏的要點是,如果你確定它總是(例如:Integer *)相同,那麼你不必傳入第二種類型。

public class MyClass{ 
    boolean truth; 
} 

public interface Lame{  
} 

public interface TestJava<T extends MyClass, U> { 
    public U func(T t); 
} 

public interface TestJavaMore<T extends MyClass> extends Lame{ 
    public void funky(); 
} 

public interface TestJavaEvenMore<T extends MyClass> extends TestJava<T, Integer> { 

} 

另一種解決方案,我認爲,如果你有類型T和U不止一個組合,我建議是使用一個工廠,你想要的類型創建一個具體的實例。這是你可以研究一個共同的模式,但在這種情況下,它是這樣的:

public class TestJavaImpl<T extends MyClass, U> implements TestJava{ 
     @Override 
     public Object func(MyClass t) { 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 
    } 

    public TestJava TestJavaFactory(){ 
     TestJava testJava = null; 
     if (true == true){ 
      testJava = new TestJavaImpl<MyClass, Integer>(); 
     } else { 
      testJava = new TestJavaImpl<MyClass, Float>(); 
     } 
     return testJava; 
    } 

*提示:別忘了W/java和模板,你必須使用「I」 nteger不是「我」 nteger