不知道这里出了什么问题,但是有一段时间没有使用泛型了,所以这可能是我不记得的,但是就我所知,基本上该代码“应该”起作用,但是确实可以不是:
public static class MyModel {}
protected static <T extends MyModel> FlowableTransformer<Response<T>, T> convert(Class<T> responseClass) {
return observable -> observable.map((Function<Response<T>, T>) response -> {
MyModel m = new MyModel();
return (T)m;
});
}
使用此方法时,在运行时会收到Classcastexception。基本思想是该方法可以返回“ MyModel”或其任何子类(因此T扩展了MyModel)。难道它现在不能随MyModel本身返回吗?
显然,这只是问题的要点,而不是实际的代码。任何帮助表示赞赏。
答案 0 :(得分:1)
假设我们有以下3个类:
public class A {}
public class B extends A {}
public class C extends B {}
和以下功能:
public static <T extends A> T foo() {
A ret_val = new A();
return (T)ret_val;
}
以下代码将正常运行,没有任何例外:
A obj = foo();
因为,这里ret_val
方法内的foo()
被强制转换为A
的实际类型ret_val
。
但是以下代码将引发异常:
B objB = foo(); // throws ClassCastException exception
C objC = foo(); // throws ClassCastException exception
因为您要在此处执行的操作是将类型A
的对象强制转换为B
(或C
),这是非法的。