java - 如何执行检查类型转换?

标签 java generics casting

我是泛型的新手,遇到了问题。

考虑以下代码:

public class A {}
public class B extends A {}

public <T extends A> T getB()
{
    A test = new B();
    Class<B> clazz = B.class;
    if (clazz.isInstance(test))
    {
        return (T)test;
    }
    return null;
}

这会生成一个未检查的转换警告。在 return (T)test; 行。 但显然我正在使用 if (clazz.isInstance(test)) 行检查类型。

有没有办法进行“检查转换”?

我不希望只是抑制警告,而是实际实现检查转换。遗憾的是,我找不到有关如何执行检查转换的信息。

最佳答案

Is there a way to do a "checked cast"?

当然可以,但需要注意的是它真的对您没有帮助,因为您的方法在一些地方被硬编码为使用 B。您可以执行转换:

clazz.cast(test)

...但这将转换为 B,而不是 T。特别是,假设我跑了:

public class C extends A {}

...

C c = foo.<C>getB();

您希望它如何工作?

您可能希望将代码更改为:

public <T extends A> T getB(Class<T> clazz)
{
    A test = // get A from somewhere
    return clazz.isInstance(test) ? clazz.cast(test) : null;
}

那没关系,因为 clazz.cast 将返回类型为 T 的值,您可以返回它。

关于java - 如何执行检查类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26022518/

相关文章:

c - "error: ‘_Generic’ 指定了两个兼容的类型”但在某些编译器上没有

c++ - 我可以为任何 C++ 编译器假设 (bool)true == (int)1 吗?

java - 为什么在向下转换时在编译时不抛出 classcastException?

java - 对 hashCode 和 equals 使用中间数组

java - 我怎样才能避免这个 if 语句

java - 静态元模型 JPA 中的多态关联

java - Comparable<T> 与 Raw Comparable

java - 将基类从java中的反序列化集合转换为继承类

java - 如何使用 Java SDK 访问受 IAM 角色保护的 S3 存储桶?

java - 执行附加逻辑的 getter 和 setter