3 回答

TA貢獻1831條經驗 獲得超10個贊
不,你寫的不會編譯。
您可以使用命名工廠方法 + 私有構造函數來實現類似的結果:
public class Action {
private Action(Type discriminator, String s, Float f) {...}
public static ofA(String value) { return new Action(Type.A, value, null); }
public static ofB(Float value) { return new Action(Type.B, null, value); }
public static ofC(String value) { return new Action(Type.C, value, null); }
}
構造函數可能會有許多 if / else 分支。(抱歉,代數類型和模式匹配在 Java 中尚不可用。)

TA貢獻1873條經驗 獲得超9個贊
看來您要建模的是三種相關類型
A,帶有字符串值,
B,具有浮點值,并且
C,帶有字符串值。
如果是這樣,Java 非常希望您創建一個抽象基類的三個子類 A、B 和 C,因為 Java 并不真正處理不相交的總和類型(又名不相交聯合類型,標記聯合類型)出色地。
Stack Overflow question中討論了有關如何使用“標簽”(這是名稱標記聯合或標記總和的來源)的單一類型的信息。最好在某個時候檢查該問題,因為提供了很多想法;大多數使用泛型。
恕我直言,Java 從來沒有真正找到處理求和類型的正確方法。Java 8 引入了可選項,但“僅可選項”,因此正確的求和類型需要一些工作。
因此,與此同時,請考慮通常的 Java 解決方法:
子類(嘆息)
靜態工廠方法(因為你不能用枚舉重載構造函數:A、B 和 C 都屬于同一類型)。
編輯:請參閱@9000 的精彩回答,它準確地展示了如何實現靜態工廠方法。

TA貢獻1773條經驗 獲得超3個贊
看起來 A 和 C 屬于同一個“類型”家族,而 B 屬于另一個類型。在這種情況下,您應該定義兩種類型。如果您希望能夠將兩種類型視為相同的“系列”,請讓它們實現相同的接口:
interface Type {
}
enum Type1 implements Type {
A,
C
}
enum Type2 implements Type {
B
}
public class Action {
public Action(Type1 type, String value) {}
public Action(Type2 type, Float value) {}
}
添加回答
舉報