Soru Java: method parametresindeki jenerik enum


Aşağıdaki soruya cevap:

Java: Yöntemde Enum parametresi

Bilmek istiyorum, kodları genel olarak zorunlu kılmak için nasıl biçimlendirebilirim.

Foo.java

public enum Foo { 
    a(1), b(2);
}

Bar.java

public class Bar {
    public Bar(generic enum);
}

Daha sonra, "foo" gibi daha fazla enum dersleri alacağım, ancak yine de her tür enum sınıfını içeren bir çubuk oluşturabilirsiniz. Bu arada "jdk1.6.0_20" var ...


25
2017-12-01 14:24


Menşei




Cevaplar:


İçindeki yöntemlere bakın EnumSet referans için, ör.

public static <E extends Enum<E>> EnumSet<E> of(E e)

(Bu yöntem, bir EnumSet'i belirli bir Enum öğesinden bir öğe ile döndürür. E)

Yani ihtiyacınız olan genel sınırlar: <E extends Enum<E>>


Aslında, muhtemelen Bar kendisi jenerik:

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

    private final E item;

    public E getItem(){
        return item;
    }

    public Bar(final E item){
        this.item = item;
    }
}

Ayrıca, fabrika yöntemini de ekleyebilirsiniz. from, with vb.

public static <E2 extends Enum<E2>> Bar<E2> with(E2 item){
    return new Bar<E2>(item);
}

Bu şekilde, müşteri kodunda sadece genel imzayı bir kez yazmanız yeterlidir:

// e.g. this simple version
Bar<MyEnum> bar = Bar.with(MyEnum.SOME_INSTANCE);
// instead of the more verbose version:
Bar<MyEnum> bar = new Bar<MyEnum>(MyEnum.SOME_INSTANCE);

Referans:


33
2017-12-01 14:27



Sözdizimi olduğu gibi bu örnek için teşekkür ederim - "PLACEHOLDER, PLACEHOLDER Enum'u genişletiyor" olarak okuduğum ("PLACEHOLDER," en iyisi olmayanlar için SuperType'ı genişletir ") - Roboprog


Bunu şu şekilde de yapabilirsiniz:

public class Bar {
    public Bar(Enum<?> e){}
}

Her numaralandırma Enum'u genişletir. Enum sabitlerine ihtiyacınız varsa bunu kullanabilirsiniz:

e.getDeclaringClass().getEnumConstants()

13
2017-09-23 17:31





public class bar {
    public <E extends Enum<E>> void bar(E enumObject);
}

bar yöntem şimdi her türlü enum alabilir.


7
2017-12-01 14:28