簡體   English   中英

Java中的枚舉和泛型

[英]Enum and generics in Java

我需要提供enumgeneric s的某種設施。 由於枚舉不能有類型參數 (它只是被語法禁止)並且實際上就像public static final成員一樣,我傾向於寫這樣的東西:

public class GenericEnumLikeClass<T>{

    public static GenericEnumLikeClass<MyType> TYPE_INSTANCE;
    public static GenericEnumLikeClass<AnotherType> ANOTHER_INSTANCE;

    //other things
}

問題是我以前從未做過類似的事情,嚴格來說,不確定Java公約的正確性。 它是否會被視為奇怪的東西,或者當我們需要通過提供Type Paramters來擴展類似enum的行為時使用的通用技術?

這是在Java 1.5引入枚舉之前使用的技術,因此它看起來並不奇怪。 舊的API有很多這些枚舉式的類。 我建議將構造函數設為私有,並提供一個values()方法,該方法返回所有可用實例的數組。

同意@Ingo,你可以使用它作為構造函數並提供一個value()方法,就像:

public enum GenericEnumLikeClass { MyType("TYPE_INSTANCE"), AnotherType("ANOTHER_INSTANCE");

不知道你想要用你的'通用'論證做什么,但這可以給你一些想法:

編輯:由於你沒有解釋你如何使用這個通用參數,我無法給出真實的例子。 只需添加一些方法,來解釋我的想法:

public enum MyGenericEnum {

    TYPE_INSTANCE(MyClass.class),
    ANOTHER_INSTANCE(AnotherClass.class);

    private Class<? extends SomeSuperClass> clazz;

    private MyGenericEnum(Class<? extends SomeSuperClass> clazz) {
        this.clazz = clazz;
    }

    public Class<? extends SomeSuperClass> getType() {
        return clazz;
    }

    @SuppressWarnings("unchecked")
    public <T extends SomeSuperClass> T getObject() {
        try {
            return (T) clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM