簡體   English   中英

如何申報Class<!--?--> object 是 Java 中的枚舉和接口

[英]How to declare a Class<?> object such that is is an Enum AND an Interface in Java

我有一個實用程序 class,它需要在通用 Class 上工作,但必須限制為枚舉並實現特定接口。

// These two work
Class<? extends Enum<?>> enumClass;
Class<? extends MyInterface> interfaceClass;

// This is what I want but does not work
Class<? extends MyInterface & Enum<?>> enumAndInterfaceClass;

對於 generics 我可以成功使用它

public class MyClass<T extends Enum<T> & MyInterface> {
    public MyClass(Class<T> theClass) {
        ...
    }
}

但是我不能到處使用Generics,需要單獨聲明。 我不確定這是否可能。
所以我的問題歸結為如何聲明具有這些約束的成員變量?

所以目前 MyClass 是 singleton 然后根據需要可以更新枚舉/接口。 其操作的返回值將根據給定的枚舉而改變。 我不想在上面放置 generics,因為這需要為枚舉的每次更改創建一個新實例。 已經有很多代碼在使用它,所以偏離 singleton 的代碼不會被批准。 所以必須保留參考。 我想我只能強制執行接口要求,然后在 setter 方法中檢查它是一個枚舉,否則會拋出異常,但這並不理想。

編輯(更新問題並添加更多細節)

這應該工作:

public interface MyInterface {

    void foo();
}

public final class Utils {

    public static <E extends Enum<E> & MyInterface> void doWork(Class<E> clazz) {
        for(E enumConstant : clazz.getEnumConstants) {
            enumConstant.foo();
        }
    }
}

編輯我沒有注意到你關於使用捕獲類型作為局部變量的行。 您當然可以在參數化方法的整個主體中使用它,請參閱上面修改后的代碼段。

據我所知,您只能為類和方法的類型參數聲明交集類型(這是&創建的)。 不能直接聲明交集類型的局部變量; 您可以借助 class 或方法類型參數創建此類變量,如 milkplusvellocet 的答案所示。

請參閱此類似問題的答案中的 JLS 參考: https://stackoverflow.com/a/6643378/282229

暫無
暫無

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

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