Java 类<;结果>;无法转换为类<;结果<;整数>&燃气轮机;
假设我有如下声明的API方法Java 类<;结果>;无法转换为类<;结果<;整数>&燃气轮机;,java,generics,Java,Generics,假设我有如下声明的API方法 public class Dummy { public static class Result<ValueT extends Comparable> { public ValueT value; } public static <ValueT extends Comparable> Result<ValueT> getResult(Class<? exten
public class Dummy {
public static class Result<ValueT extends Comparable> {
public ValueT value;
}
public static <ValueT extends Comparable> Result<ValueT>
getResult(Class<? extends Result<ValueT>> ofType) throws Exception {
return ofType.newInstance();
}
}
导致
error: method getResult in class Dummy cannot be applied to given types;
Result<Integer> intResult = getResult(Result.class);
^
required: Class<? extends Result<ValueT>>
found: Class<Result>
reason: cannot infer type-variable(s) ValueT
(argument mismatch; Class<Result> cannot be converted to Class<? extends Result<ValueT>>)
where ValueT is a type-variable:
ValueT extends Comparable declared in method <ValueT>getResult(Class<? extends Result<ValueT>>)
error: incompatible types: Class<Result> cannot be converted to Class<Result<Integer>>
Result<Integer> intResult = getResult((Class<Result<Integer>>)Result.class);
^
错误:类Dummy中的getResult方法无法应用于给定类型;
Result intResult=getResult(Result.class);
^
要求:课堂编辑:我不清楚最初的意图。这个例子应该适用于您的呼叫,但是它有点粗糙,不推荐使用
public class Dummy {
public static class Result<ValueT extends Comparable> {
public ValueT value;
}
public static <ValueT extends Comparable> Result<ValueT>
getResult(Class<? extends Result<ValueT>> ofType) {
return null;
}
}
公共类虚拟{
公共静态类结果{
公共价值;
}
公共静态结果
getResult(ClassEDIT):我不清楚最初的意图。这个例子应该适用于您的调用,但是它有点粗糙,不推荐使用
public class Dummy {
public static class Result<ValueT extends Comparable> {
public ValueT value;
}
public static <ValueT extends Comparable> Result<ValueT>
getResult(Class<? extends Result<ValueT>> ofType) {
return null;
}
}
公共类虚拟{
公共静态类结果{
公共价值;
}
公共静态结果
GETREST(类< p>如果通过<代码>类< /代码>的唯一目的是实例化它,请考虑使用<代码>供应商< /Cl>。它没有这个问题,也不会抛出任何异常。
以下是一个例子:
class SomeClass extends Result<Integer> {...}
public static <T extends Result<?>> T getResult(Supplier<T> constructor) {
return constructor.get();
}
如果通过<代码>类< /代码>的唯一目的是实例化它,请考虑使用<代码>供应商< /C> >。它没有这个问题,也不会抛出任何异常。
以下是一个例子:
class SomeClass extends Result<Integer> {...}
public static <T extends Result<?>> T getResult(Supplier<T> constructor) {
return constructor.get();
}
实际上并不存在Class
Class
对象在运行时表示可重新定义的类,对于ClassResult
,在运行时只有一个Class
对象,您可以通过表达式Result.Class
,它具有类型Class
。没有类
表示结果
或结果
等的对象
您可以使用类型为Class
(从Result.Class
获得)的表达式,并对其执行一系列不安全的强制转换,将其转换为类或类似的内容,例如:
`(Class<Result<Integer>>)(Class<?>)Result.class`
如果要接受Result
的子类,则假设所有子类都必须有一个无参数构造函数,就像调用.newInstance()一样
,这是一个糟糕的设计。正如Jorn Vernee的回答所建议的那样,你应该使用类似于供应商的东西。实际上没有类类类对象在运行时表示可修改的类,而类结果在运行时只有一个类对象de>,可以通过表达式Result.class
获得,该表达式具有类型class
。不存在表示Result
或Result
等的class
对象
您可以使用类型为Class
(从Result.Class
获得)的表达式,并对其执行一系列不安全的强制转换,将其转换为类或类似的内容,例如:
`(Class<Result<Integer>>)(Class<?>)Result.class`
如果要接受Result
的子类,则假设所有子类都必须有一个无参数构造函数,就像调用.newInstance()一样
在它上面,这是一个糟糕的设计。正如Jorn Vernee的回答所建议的那样,你应该使用类似于供应商的东西。不,这是对原始用例的过度简化-Dummy.Result的各种子类应该根据参数有条件地创建,这就是为什么方法被声明为getResult(类然后唯一的方法是实现一个扩展Result
的类,并将其作为getResult
参数传递。据我所知,问题中给出的所有示例都使用了类型擦除,我不确定是否有一种更简单的方法可以在不创建新类的情况下执行此操作。最终的“类”仅由客户端代码知道。问题是发生在中间API方法中,其中代码只知道要操作的某个基本结果类及其值类型。好的,让我更改我的答案以解决更接近原始问题的问题。但我仍然认为无法以“好的泛型”调用该方法我觉得我在现实生活中的问题过于简单了。正如我在@Jorns answer的评论中提到的那样-作为参数提供的类实例可以是“抽象的”,一些子类将由API实例化-这就是为什么“new Result()”在比我明确要求的更一般的情况下,将不起作用……好吧,我觉得这个问题没有真正好的解决方案,我已经结束了从原始类回溯到抑制警告-“@SuppressWarnings(“unchecked”)Result intResult=getResult((Class)Result.Class)我接受你的回答,因为它提到了这一点。不,这是对原始用例的过度简化-应该根据参数有条件地创建Dummy.Result
的各种子类,这就是为什么方法被声明为getResult(类然后唯一的方法是实现一个扩展Result
的类,并将其作为getResult
参数传递。据我所知,问题中给出的所有示例都使用了类型擦除,我不确定是否有一种更简单的方法可以在不创建新类的情况下执行此操作。最终的“类”仅由客户端代码知道。问题是发生在中间API方法中,其中代码只知道要操作的某个基本结果类及其值类型。好的,让我更改我的答案以解决更接近原始问题的问题。但我仍然认为无法以“好的泛型”调用该方法我觉得我把我的问题从现实生活中简单化了。正如我在@Jorns answer的评论中提到的那样-作为参数提供的类实例可以是“抽象的”,一些子类将由API实例化-这就是为什么“new Result()”将
class SomeClass extends Result<Integer> {...}
public static <T extends Result<?>> T getResult(Supplier<T> constructor) {
return constructor.get();
}
getResult(SomeClass::new); // Passes the constructor.
`(Class<Result<Integer>>)(Class<?>)Result.class`
public static <ValueT extends Comparable<? super ValueT>> Result<ValueT>
getResult() throws Exception {
return new Result<ValueT>();
}