有没有办法强制转换对象以返回方法的通用值?我试过这种方式但是发生了类型转换异常:
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 {
}
异常(exception):
java.lang.ClassCastException:
Cannot cast com.zarinak.app.model.Super to com.zarinak.app.model.Sub1
有办法吗?
最佳答案
您尝试将新的 Super 对象转换为扩展它的对象类型的方式不正确。
假设您要创建一个 Sub1 对象 - 您使用 Super 类中的构造函数实例化一个 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()
。不过,这确实确保了对象的类扩展了 Super。
关于java - 泛型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48014694/