接口上的Java循环

接口上的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

我有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.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");}