我需要能够将函数作为参数返回的值传递给另一个函数。我不知道如何用Java来实现它。我有过
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(),以下两种构造都不会编译:
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函数?
发布于 2021-02-21 20:22:31
如果要在编译时使用为T推断的特定类型调用T,则不能指望以clazz的形式直接传递getActualEnumClass()的返回值。
Class<? extends Enum<? extends A>>作为getActualEnumClass()的返回类型几乎毫无用处。当然,您可以将返回类型转换为调用上下文中的特定类型(在其中调用process()),但是不使用通配符返回类型也可以做得更好。
由于您实际上没有任何方法来对getActualEnumClass()的返回值强制执行编译时类型安全性,所以可以添加一个类型变量来代替您的通配符,但是只能在调用该方法的地方推断它。
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()中的类型见证才是必要的。否则可以通过使用外派上下文来避免这种情况:
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()中是众所周知的。
发布于 2021-02-21 20:15:16
如果使用Class,只需从getActualEnumClass返回类并将其传递给process方法,如下所示
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();
}当然,您也必须处理异常。
https://stackoverflow.com/questions/66306453
复制相似问题