java - 泛型转换

标签 java android generics casting generic-programming

有没有办法强制转换对象以返回方法的通用值?我试过这种方式但是发生了类型转换异常:

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/

相关文章:

Java 字符串和字符串池

java - 我想使用两个线程打印斐波那契数列。就像第一个数字应该由第一个线程打印,然后第二个数字由第二个线程打印等等

java - 如何使用 Selenium WebDriver 获取 HTTP 响应代码

android - 如何在 Android Things 上运行 TensorFlow Inference,例如对图像进行分类?

android - 如何快速将图像文件路径列表转换为位图列表?

Java:检查泛型是否为 int

java - 如何对具有动态属性的对象进行建模?

android - 从 ImageView 内的 ConstraintLayout 中删除多余的空间

maven - 如何使 Maven 在原始类型上失败?

c# - 获取泛型对象参数的实际类型