泛型转换

Casting By Generics

有没有办法将对象转换为 return 方法的通用值?我试过这种方式但是发生了铸造异常:

public <S extends Super> S get(Class<S> clazz) {
    return (S) new Super();
}

public class Super {

}

public class Sub1 extends Super {

}

public class Sub2 extends Super {

}

异常:

java.lang.ClassCastException: 
Cannot cast com.zarinak.app.model.Super to com.zarinak.app.model.Sub1

有办法吗?

您尝试将新的 Super 对象转换为扩展它的对象类型的方式不正确。

假设您想创建一个 Sub1 对象 - 您使用 Super class 中的构造函数实例化一个 Super 对象,然后告诉编译器该对象实际上是 Sub1,但事实并非如此;它既不包含 Sub1 特定的方法或变量,也没有使用 Sub1 构造函数构造。编译器知道该对象不是 Sub1 并且会在运行时抛出错误。虽然这对于您的代码的当前结构可能不是问题,但当 Sub1 包含 Super 不包含的方法或变量时,它就会成为问题。如果编译器允许这种形式的转换,则尝试在轨道上调用这些方法将是一个重大问题。

这将实现你想要的。通过将 S 泛型类型限制为 Super 的扩展,您可以有效地绕过实例化 Super 对象并从那里进行转换。

public <S extends Super> S get(Class<S> clazz) throws IllegalAccessException, InstantiationException {
    S s = clazz.newInstance();
    return s;
}

将它作为一个方法,没有任何额外的主体,几乎完全没有意义,你也可以调用 clazz.newInstance()。不过,这确实确保了对象的 class 扩展了 Super.