- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码
public interface SomeInterface { }
public class TestConstants {
public static <E extends Enum<E> & SomeInterface> E getEnumString(Class<E> clazz, String s){
for(E en : EnumSet.allOf(clazz)){
if(en.name().equalsIgnoreCase(s)){
return en;
}
}
return null;
}
public enum A implements SomeInterface {
V1,
V2,
V3;
}
public enum B implements SomeInterface {
V1,
V2,
V3;
}
// And so on.......
}
我可以在代码的其他地方调用 call
TestConstants.getEnumString(TestConstants.B.Class,"V2")
它会返回TestConstants.B.V2
一切都很好。
但我的问题是,如果我不知道要搜索的实际 Enum 类怎么办即
Class<?> enumClass
包含其中一个枚举,但我不知道是哪个。现在我从 TestConstants 类外部的代码中,我可以使用类似下面的内容
if (enumClass.equals(TestConstants.A.class)) {
TestConstants.getEnumString(TestConstants.A.class,value);
} else if (enumClass.equals(TestConstants.B.class)) {
TestConstants.getEnumString(TestConstants.B.class,value);
} else if (enumClass.equals(TestConstants.C.class)) {
// And so on....
但我真的很想将这段代码移到 TestConstants 类中。但我似乎做不到。例如,如果我添加此功能
public static <E extends Enum<E> & SomeInterface> E fromUnknownClass(Class<?> enumClass, String name) {
if (enumClass.equals(TestConstants.A.class)) {
return TestConstants.fromString(TestConstants.A.class,name); <-- Compile error
} else if .......
.......
}
我得到以下编译错误
incompatible types: inference variable E has incompatible bounds equality constraints:
TestConstants.A upper bounds: E,java.lang.Enum<E>,SomeInterface
我在这里尝试的是可能的,还是有一些我不知道的泛型魔法?
最佳答案
你正在让你的生活变得不必要的艰难。在你的通用签名中
public static <E extends Enum<E> & SomeInterface> E getEnumString(Class<E> clazz, String s)
SomeInterface
的声明已经过时了。毕竟,无论特定的 enum
是否有效,该方法都有效。工具 SomeInterface
.它保证返回的类型与您传入的类匹配(阅读:类型为 E
)因此结果将实现 SomeInterface
如果 E
工具 SomeInterface
.
所以如果你把方法改成
public static <E extends Enum<E>> E getEnumString(Class<E> clazz, String s)
并传入A.class
或 B.class
结果将是 A
类型或 B
, 分别执行 SomeInterface
.这甚至适用于调用者可能确实需要约束 SomeInterface
的通用上下文。已实现:
public <T extends Enum<T>&SomeInterface> void doSomethingWithSomeInterface(Class<T> cl) {
// works without getEnumString declaring SomeInterface ...
T t=getEnumString(cl, "V1");
}
但是,如果您传入 Class<?>
, 没有人能说结果是否会执行 SomeInterface
验证它的最佳方法是进行普通转换或 instanceof
关于结果。
如果您按上述方式更改了签名,即使是未知类型,它也很容易使用:
Class<?> cl=A.class; // the "unknown" type Class<?>
Object obj=getEnumString(cl.asSubclass(Enum.class), "V1");
请注意,如果您不需要不区分大小写的匹配,有更简单的方法来获得 enum
持续的。对于已知类型,您可以简单地调用,例如A.valueOf("V1")
,对于泛型方法,它很简单:
public static <E extends Enum<E>> E getEnumString(Class<E> clazz, String s){
return Enum.valueOf(clazz, s);
}
这使得整个实用程序方法过时为 Enum.valueOf(Class, String)
已经是那个实用方法了。
即使您需要不区分大小写的查找,您也可以考虑 enum
常量通常全部大写,如果您遵守此约定,整个操作将变为:
Class<?> clazz=A.class; // simulate unknow type
String name="v1"; // for case insensitive match
// the operation:
Object aV1=Enum.valueOf(clazz.asSubclass(Enum.class), name.toUpperCase(Locale.ROOT));
SomeInterface si=(SomeInterface)aV1;
无需额外的实用方法。
关于java - 使用通配符 Class<?> 从枚举类中检索枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28755310/
我只想知道它们之间的区别: .class .class{ font-size:14px; } 对比: .class > .class{ font-size:14px; } 是一样的东西吗? 最佳答案
PrimeFaces 文档的以下摘录使标题中描述的两个选择器之间似乎存在差异: .ui-widget, .ui-widget .ui-widget { font-size: 90% !imp
我正在尝试选择特定值。但我遇到了一个问题。 我有两个元素,一个有 X Y,另一个有 X Y Z。 当选择 X Y Z 时,我也收到 X Y 的值...有没有办法让它寻找 X AND Y AND Z 而
.class.class 和 .class .class 有什么区别? 最佳答案 .class .class 匹配类 .class 的任何元素,这些元素是类 .class< 的另一个元素的后代/. .
我正在研究 Classname.class 和 Classname.class.toString() 并发现了一些不寻常的东西。 .class 在同一个类上运行时似乎等同于 .class。尽管 .cl
我试图在Dart中扩展列表并在此列表中使用另一个类。 这是我的示例,其中注释出了问题: import "Radio.dart"; // extends ListBase { List ra
我有一个很大的“经理”类,我认为它做得太多了,但我不确定如何将它划分为更多逻辑单元。 一般来说类主要由以下方法组成: class FooBarManager{ GetFooEntities();
我在一个文件中定义了一个抽象父类(super class),在另一个文件中定义了一个子类。我需要父类(super class)文件和堆栈跟踪报告来找到一个包含它。 但是,当它到达“extends”行时
我在 A. Alexenderscu 的现代 C++ 设计中找到了一些模板示例 作者使用以下行的地方 template class CheckingPolicy // class SmartPt
看一下这段代码: public static class A { public void doA() { } } public static class B extends A {
我有两个具有 .body 类的 div,但是,一个位于另一个具有 .box 类的 div 中 - 如下所示: 我只想为 .box 内部的 .body 设置样式...但我在下面所
我一定是遗漏了 C++ 规范中的某些内容,因为我无法解释为什么以下代码可以成功编译: class MyClass { static void fun(); }; int main() { MyClas
我正在尝试在 python 中“模拟”命名空间。我使用内部和外部类层次结构来创建我的命名空间。例如,您希望将文件(如资源)的路径保存在一个位置。我试过这样的事情: src = #path to sou
在试验 online crystal compiler 时(这太棒了),我遇到了一个我似乎无法找到解释的错误: class Person class Current < self end
在查看我的一段代码时,我陷入了如下的一条语句。 TMyObjectClass = TMyObject 类; 我有点困惑,不知道这句话是什么意思。由于 TMyObjectClass 在该语句上方没有声明
我正在编写一个简单的应用程序,以学习一些基本的Dart编程,但无法弄清楚其结构和包含的内容-我得到了一个重复的类Point 首先,我有一个叫做MouseTrack的主类。它将初始化列表并产生循环。 #
在 org.springframework.core.SerializableTypeWrapper (版本 5.2.3),第 112 行有以下代码: if (GraalDetector.in
我希望将鼠标悬停在子导航中的列表项上,以激活页面上该类别中所有项的类(不仅仅是父元素或同级元素)。有任何想法吗?这是我的意思的一个例子: img.BLUE {border:1px solid #FF
我正在通过 ClassLoader 加载类: Class clazz = urlClassLoader.loadClass(name.substring(0, name.length() - 6).r
以下简化的类在从 get() 返回值时执行不同的操作,具体取决于该类是被赋予 double 值还是数组作为模板参数: #include "array" #include "type_traits" t
我是一名优秀的程序员,十分优秀!