2015-11-05 28 views
2

我是隻是爲了通過枚舉覆蓋的接口傳遞只是一種枚舉的方法 - 在這我要更好的方式來創建限制用戶

interface Parent{ 
    int someMethod(); 
} 

和方法通過Parent的實現者。這種方法要限制用戶通過非ENUM的其他任何實施者 -

public static <T extends Enum<? extends Parent>> T fromInt(Class<T> enumClass){} 

現在的問題是

  1. 枚舉簽名是不潔加上使用?
  2. 爲了訪問父類的someMethod將需要在該方法中進行類型轉換。如果我們想訪問它像這樣 -

    Arrays.stream(enumClass.getEnumConstants()) 
          .filter(ev -> ((Parent)ev).someMethod() == someVal) 
          .findFirst().get(); 
    

是否有創建這個方法的簽名來解決這些問題的一個更好的辦法?

回答

5

您不能強制將接口的實現者強制爲枚舉。

但是,您可以通過說類型T應該是枚舉類型,T extends Enum<T>Parent類型與& Parent來達到目的。 &用於聲明多個接口的交集。它確保在該方法中,T可以被綁定到EnumParent

這將是一個實現:

public static <T extends Enum<T> & Parent> T fromInt(Class<T> enumClass) { 
    return Arrays.stream(enumClass.getEnumConstants()) 
       .filter(ev -> ev.someMethod() == 1) 
       .findFirst() 
       .get(); 
} 
+0

這難道不是一種***工會**的兩個接口*作爲類必須uimplement ** **兩種接口? – OldCurmudgeon

+1

@OldCurmudgeon它被稱爲交集。看看[JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.9)。 – Tunaki

+1

啊!我立場糾正。 TLS中的單詞非常混淆。 :( – OldCurmudgeon

相關問題