2014-10-11 103 views
0

我可以強制子類在其中創建枚舉嗎?強制子類聲明枚舉

class Document<T extends Enum<T>>{ 
    Map<T, String> fields; 
} 
class TextDocument extends Document<TextDocument.Field>{ 
    public enum Field{ 
     ... 
    } 
} 

如何強制執行Document的任何實現以在其中包含一個名爲Field的枚舉?在上面的例子中,TextDocument可以擴展Document以及其他一些枚舉(比如GraphDocument.Field),這也不應該被允許。我如何創建這個限制?我需要將此規則強制實施爲子類 - 「您必須擁有自己的枚舉」。這甚至有可能嗎?通過一些黑客的方式?有任何想法嗎?

+0

您可以使用反射 – msrd0 2014-10-11 12:40:04

+0

您可以舉一個小例子嗎? – 2014-11-19 09:44:12

+0

嘗試加載另一個類的枚舉(通過調用getClass()。getXxx')並且如果沒有發現拋出異常 – msrd0 2014-11-19 14:29:16

回答

1

總之,你不能。但是,您可以強制它返回特定枚舉值的數組。你也可以強制枚舉實現一個接口。

public interface SomeInterface { 
    // any methods you want to be able to perform on the enums 
} 

public abstract class SomeSuperClass<T extends SomeInterface> { 
    abstract T[] getSome(); 
} 

public class SomeSubclass extends SomeSuperClass<SomeInterface> { 
    public enum SomeEnum implements SomeInterface { 
     testEnum { 
     // interface implementation 
     } 
    } 

    public SomeInterface[] getSome() { 
     return SomeEnum.values(); 
    } 
} 

這是一個相當尷尬的解決方案,但它的工作原理。

+0

Serializable如何期望一個應該是public,static,final和long的變量聲明?儘管它沒有執行,但至少在日食中出現黃色標記。我需要複製這樣的行爲。有任何想法嗎? – 2014-11-19 09:43:17

+0

對不起,我的壞。不知道這些日食警告,因爲我有一個印象,這些是java編譯器警告。 – 2015-12-08 13:13:57