簡體   English   中英

Java枚舉泛型

[英]Java enum generics

我的課程如下

public class Baseclass {
   private final EmployeeEnum empEnum;
   public Baseclass(EmployeeEnum e) {
       this.empEnum = e;
    }
}

現在,我想使Baseclass通用並使其接受某種類型的Enums。

由於枚舉不能擴展類我已經創建了一個接口IEnum並提出EmployeeEnumManagerEnum (新枚舉我創建)實現的接口。

我對Baseclass做了如下更改,

public class Baseclass {
   private final Enum<?> empEnum;
   public Baseclass(Enum<?> e) {
       this.empEnum = e;
    }
}

有一個更好的方法嗎?

干杯!!

如果只需要任何枚舉,則可以使用E extends Enum<E>

public class Baseclass<E extends Enum<E>> {

    private final E e;

    public Baseclass(E e) {
        this.e = e;
    }
}

所有enum擴展Enum<E>以便它們可以繼承標准方法,例如namevalues 這是enum不能擴展其他類的原因之一,因為Java中不允許任何class擴展兩個類。

每個子類都必須使用特定的枚舉對BaseClass進行擴展,如下所示:

enum MyEnum {

    I, Me, My, Mine;
}

class A extends BaseClass<MyEnum> {

    public A(MyEnum e) {
        super(e);
    }

}

如果您想要進一步的限制-例如使子類僅使用特殊類型的枚舉(例如實現接口),則可以將接口添加到泛型中,如下所示:

public interface SpecialEnum {

}

enum MyEnum implements SpecialEnum {

    I, Me, My, Mine;
}

enum NotSpecialEnum {

    Am, I, Special;
}

public class BaseClass<E extends Enum<E> & SpecialEnum> {

    private final E e;

    public BaseClass(E e) {
        this.e = e;
    }
}

class A extends BaseClass<MyEnum> {

    public A(MyEnum e) {
        super(e);
    }

}

// This is not allowed.
class B extends BaseClass<NotSpecialEnum> {

    public A(NotSpecialEnum e) {
        super(e);
    }

}

您甚至可以將枚舉放入擴展類中:

class A extends BaseClass<A.AnotherEnum> {

    enum AnotherEnum implements SpecialEnum {

        Hello, All;
    }

    public A(AnotherEnum e) {
        super(e);
    }

}

有一個更好的方法嗎?

更好的方法是做什么? 您可以更改為以下代碼,該代碼將限制您使用擴展IEnum的枚舉:

class Baseclass<T extends Enum<T> & IEnum> {
    private final T empEnum;
    public Baseclass(T e) {
        empEnum = e;
    }
}

因此, T extends Enum<T> -T必須是Enum & -,而IEnum - T必須擴展IEnum

暫無
暫無

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

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