首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:令牌上的语法错误,而不是预期的PrimitiveType -不能强制转换枚举扩展接口

Java:令牌上的语法错误,而不是预期的PrimitiveType -不能强制转换枚举扩展接口
EN

Stack Overflow用户
提问于 2021-02-21 19:51:15
回答 2查看 171关注 0票数 1

我需要能够将函数作为参数返回的值传递给另一个函数。我不知道如何用Java来实现它。我有过

代码语言:javascript
复制
interface A {}
enum B implements A {}
class C {
  Class<? extends Enum<? extends A>> value;
  Class<? extends Enum<? extends A>> getActualEnumClass() {
    return value;
  }

  <T extends Enum<T> & A> T process(Class<T> clazz, Set<T> someValues) {
  }
}

不幸的是,我也不能将getActualEnumClass()的结果传递给process(),以下两种构造都不会编译:

代码语言:javascript
复制
class C2 {
  Class<? extends Enum<? extends A>> getActualEnumClass() {
    \\...
  }

  <T extends Enum<? extends A>> T process(Class<T> clazz) {
  }
}
class C3 {
  Class<T extends Enum<T> & A> getActualEnumClass() {
    \\...
  }

  <T extends Enum<T> & A> T process(Class<T> clazz) {
  }
}

如何将getActualEnumClass函数返回的类传递给process函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-21 20:22:31

如果要在编译时使用为T推断的特定类型调用T,则不能指望以clazz的形式直接传递getActualEnumClass()的返回值。

Class<? extends Enum<? extends A>>作为getActualEnumClass()的返回类型几乎毫无用处。当然,您可以将返回类型转换为调用上下文中的特定类型(在其中调用process()),但是不使用通配符返回类型也可以做得更好。

由于您实际上没有任何方法来对getActualEnumClass()的返回值强制执行编译时类型安全性,所以可以添加一个类型变量来代替您的通配符,但是只能在调用该方法的地方推断它。

代码语言:javascript
复制
class C {
    <E extends Enum<E> & A> Class<E> getActualEnumClass() {
        return null;
    }

    <T extends Enum<T> & A> T process(Class<T> clazz) {
        return null;
    }

    void test() {
        process(this.<B>getActualEnumClass());
    }
}

只需注意,在getActualEnumClass()内部,您将不得不转换返回值,这将导致一个未经检查的强制转换警告,您必须与之共存。

此外,请注意,只有当参数与方法调用一起直接传递时,this.<B>getActualEnumClass()中的类型见证才是必要的。否则可以通过使用外派上下文来避免这种情况:

代码语言:javascript
复制
void test() {
    Class<B> cls = this.<B>getActualEnumClass();
    process(cls);
}

现在,如果用例中的this.<B>getActualEnumClass()无法了解B,那么您还有一个更大的问题;这是因为您没有任何类型的<T>可供编译器在<T extends Enum<T> & A> T process(Class<T> clazz)上推断。如果你发现自己在这个领域,请重新设计你的代码。不过,这不太可能,因为像B.class这样的东西可能在test()中是众所周知的。

票数 0
EN

Stack Overflow用户

发布于 2021-02-21 20:15:16

如果使用Class,只需从getActualEnumClass返回类并将其传递给process方法,如下所示

代码语言:javascript
复制
 Class<? extends Enum<? extends A>>  getActualEnumClass() {
    
    return B.SOMETHING.getClass();
}

<T extends Enum<T> & A> T process(Class<? extends Enum<? extends A>> clazz){

    return (T)clazz.newInstance();
}

当然,您也必须处理异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66306453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档