正确转换泛型

努特尔

我怎样才能施展Class<? extends Enum<?>>Class<T>,在那里<T extends Enum<T>>具体来说,我需要将实例传递Class<? extends Enum<?>>给该Enum.valueOf()方法。http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#valueOf(java.lang.Class,%20java.lang.String)

这是我的课程:

enum Foo1 implements Bar {
  VALUE1("A"), VALUE2("B");

  String me;

  Foo1(String me) { 
    this.me = me;
  }

  String getMe() {return me;}
}

enum Foo2 implements Bar {
  V1("A"), V2("B");

  String me;

  Foo2(String me) { 
    this.me = me;
  }

  String getMe() {return me;}
}

interface Bar {
  String getMe();
}

enum Z { 
  Z1(Foo1.class), Z2(Foo2.class);
  private final Class<? extends Enum<? extends Bar>> myEnum;
  Z(Class<? extends Enum<? extends Bar>> myEnum) {
     this.myEnum = myEnum;
  }

  Class<? extends Enum<? extends Bar>> getMyEnum() {
     return myEnum;
  }
}

class X {
   public getMe(Z z, String fooValue) {
       Class<? extends Enum<? extends Bar>> fooEnum = z.getMyEnum();
       // does not compile
       return ((Bar)Enum.valueOf(fooEnum, fooValue)).getMe();
   }
}
亚历克斯-GlassEditor.com

最简单的方法是将其转换为原始类型Class

return ((Bar)Enum.valueOf((Class)fooEnum, fooValue)).getMe();

如果您不喜欢强制转换,则可以将枚举类放在Z中以将其枚举类包装在另一个类中,以保留它们的更多类型关系。

enum Z {
    Z1(new Holder<>(Foo1.class)), Z2(new Holder<>(Foo2.class));
    private final Holder<?> myEnum;

    Z(Holder<?> myEnum) {
        this.myEnum = myEnum;
    }
    Holder<?> getMyEnumHolder() {
        return myEnum;
    }

    static class Holder<T extends Enum<T> & Bar> {
        private final Class<T> myEnum;

        private Holder(Class<T> myEnum) {
            this.myEnum = myEnum;
        }

        Class<T> getMyEnum() {
            return myEnum;
        }
    }
}

class X {
    public static String getMe(Z z, String fooValue) {
        return Enum.valueOf(z.getMyEnumHolder().getMyEnum(), fooValue).getMe();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章