接口上的Java循环
我有10个接口接口上的Java循环,java,interface,enums,Java,Interface,Enums,我有10个接口(IInterface1,IInterface2…IInterface10),它扩展了一个名为interface的接口,我还有一个带有10个值的枚举IEnume 目前我正在这样做: 这是一个伪代码 type = some enum values. switch(type){ IEnume.value1: if (IInterface1.class.isAssignableFrom(myClass)) {system.out.println("something";)} IEnume
(IInterface1,IInterface2…IInterface10)
,它扩展了一个名为interface
的接口,我还有一个带有10个值的枚举IEnume
目前我正在这样做:
这是一个伪代码
type = some enum values.
switch(type){
IEnume.value1:
if (IInterface1.class.isAssignableFrom(myClass)) {system.out.println("something";)}
IEnume.value2:
if (IInterface2.class.isAssignableFrom(myClass)) {system.out.println("something";)}
IEnume.value3:
if (IInterface3.class.isAssignableFrom(myClass)) {system.out.println("something";)}
...
...
...
IEnume.value10:
if (IInterface10.class.isAssignableFrom(myClass)) {system.out.println("something";)}
}
如您所见,每个枚举值的代码相同,唯一的区别是i接口
我让我所有的界面都扩展了界面
。这样做是否有助于实现一件事:
IInterface i;
type = some enum values.
switch(type){
IEnume.value1:
i = IInterface1
IEnume.value2:
i = IInterface2
...
...
...
IEnume.value10:
i = IInterface10
}
这样我就可以做到:
if(i.class.isAssignableFrom(myClass)
问题是我做不到
i = IInterface1
更新一
我的情况是,我正在从一个文件中准备接口的名称,并从同一个文件中准备接口的实际类实现。为什么不在
IEnume
类上有一个方法:
enum IEnume {
value1(IInterface1.class),
value2(IInterface2.class);
private Class<? extends IInterface> iClass;
private IEnume(Class<? extends IInterface> iClass) { this.iClass = iClass; }
public boolean isInterfaceAssignable(Class<?> clazz) {
return this.iClass.isAssignableFrom(clazz);
}
}
很难说出你真正想要在这里实现什么,所以我希望这个答案朝着正确的方向发展 你能给
i界面添加一个方法void Print\u something()
并简单地调用它,而不是执行整个开关
吗?您可以让所有其他接口扩展这个“基本”接口,因此所有实例都将被迫实现它。根本不需要检查实际的类型-更简单、更容易理解
问题是我做不到
i=i接口1
您可以做的是:
Class cls = Interface.class;
cls.isAssignableFrom(anotherClass);
或者(根据@talex的建议),您可以使用它来消除未经参数化的警告:
Class<? extends Interface> cls = Interface.class;
cls.isAssignableFrom(anotherClass);
Class您可以按照建议将接口存储在枚举中,也可以制作一个映射:
map.put(IEnume.value1, IInterface1.class);
map.put(IEnume.value2, IInterface2.class);
map.put(IEnume.value3, IInterface3.class);
...
map.put(IEnume.value10, IInterface10.class);
然后,要执行验证,请执行以下操作:
if (map.get(type).isAssignableFrom(myClass)){System.out.println("something");}
@控制论WerkGuruorc我不能在界面上做新的事情,我希望那个否决投票的家伙,告诉我我做错了什么。我向你展示了这个问题以及我如何解决它。我想这是一个合理的问题。否则,告诉我我的错误,以便下次我可以改进。我读了问题,但我仍然不知道你需要这个做什么。这听起来太复杂了,你应该展示一下你是如何使用它的,这样我们才能找到一个好的答案。我真的很想知道你是否想在这里使用。有可能看到实际的java代码吗?我很难理解你的要求。很好。这就是接口的用途。假设myClass
和print
函数之间存在关系,那么整个函数可以替换为myClass.printSomething()
我不需要从该接口调用任何方法,我正在进行类验证,你能看一下我的更新吗?你能检查一下其他答案吗?我有一个问题,用户似乎已经离开了。这种方法可以扩展到使用所有接口的静态数组来实现基本接口,在加载程序集之后通过反射填充。这将使我们不必使枚举保持最新。我不确定这是否有用。(假设这是必需的——仍在等待OP更详细地解释场景。)从第一次更新后给出的信息来看,这似乎是问题的合理答案。你有我的投票权。我试着做icustomPublishinedsService(icustomPublishineds.class)
在我的枚举中,但是我得到了构造函数插件类型(类)未定义
对于构造函数,尝试使用类类型的arg,赋值在哪里?我无法执行此操作:Class cls=icustomPublishineds.Class代码>我得到编译器错误类型不匹配:无法从一个类转换到另一个类
更新了答案。(由于类型类没有参数化,您将得到一个警告)或者您可以执行'classMap是否为map map=newhashmap()代码>?当然,这就是想法;为了简洁起见,我省略了变量声明。这不起作用,我做了这个map.put(PluginTypes.icustomPublishinedService,icustomPublishineds.class)代码>但是我得到了编译器错误无法引用静态枚举字段PluginTypes.icustomPublishinedsService在初始值设定项中
我在枚举的构造函数中这样做了,我应该在另一个方法中这样做吗?我把它放在另一个方法中,我得到了这个错误方法put(PluginTypes,IPlugin)在类型映射中,不适用于参数(插件类型、类)
if (map.get(type).isAssignableFrom(myClass)){System.out.println("something");}