在我的Java應用程序中,我創建了返回Either<A, B>
對象的方法。Java:部分應用泛型類 - 如何消除冗餘類型參數?
但是,我真正使用的類型是Either<String, T>
,即String
始終是左側類型參數,而右側參數可以是任何類型。
這裏是functionaljavaEither
執行我使用:
https://github.com/functionaljava/functionaljava/blob/master/core/src/main/java/fj/data/Either.java
這裏Either
被定義爲:
public abstract class Either<A, B>
爲了讓我的代碼更簡潔一些,我想創建一個通用類LeftAppliedEither<T>
,其將代表Either
,其中左類型參數被設置爲字符串。
所以我想這樣做是這樣的:
public abstract class LeftAppliedEither<T> extends Either<String, T> {}
然而,這是行不通的。
首先,Either
可以因爲其唯一的構造函數定義private
不會被我延長。其次,假設我已經通過簡單地將Either
的代碼複製到我的代碼中(我們將其稱爲MyEither
)並刪除私有構造函數(並解決一些小的編譯錯誤)來解決第一個問題。
所以我在我的代碼如下類:
package fj.data;
//import ....
public abstract class MyEither<A, B> {
// private MyEither() {
//
// }
//the rest of the code is more or less like in the original Either
}
不過,我想有以下問題:
我不會寫下面的代碼:
LeftAppliedEither<Integer> hello = LeftAppliedEither.left("hello");
我只可以做這樣的事情:
MyEither<String,Integer> hello = LeftAppliedEither.left("hello");
那麼,這是我正在做這個改變的全部原因 - 我希望不要在我的代碼中使用帶有兩個參數的泛型,因爲指定左邊的String
是多餘的。
除了重寫整個LeftAppliedEither
類以外,是否有更好更優雅的方法來實現這一點?
http://www.ibm.com/developerwo rks/library/j-jtp02216/ –
或者,正如你所說的,不可能擴展。如果唯一的問題確實是你需要在聲明時輸入,那麼,我真的沒有看到這個大問題嗎? –
JHH
@Oliver Charlesworth謝謝,一篇好文章。 – rapt