Java泛型和classcastException

时间:2019-04-08 06:43:36

标签: java generics rx-java2 classcastexception

不知道这里出了什么问题,但是有一段时间没有使用泛型了,所以这可能是我不记得的,但是就我所知,基本上该代码“应该”起作用,但是确实可以不是:

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本身返回吗?

显然,这只是问题的要点,而不是实际的代码。任何帮助表示赞赏。

1 个答案:

答案 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),这是非法的。