如何进行格式化演员表演?

All*_*Kll 8 java generics casting

我是Generics的新手,我遇到了一个问题.

请考虑以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

这会生成一个未经检查的强制转换警告.就return (T)test;行了.但显然我正在用if (clazz.isInstance(test))线条检查类型.

有没有办法进行"检查演员表"?

我不打算只是压制警告但实际上是实施了一次检查.不幸的是,我无法找到有关如何执行检查演员表的信息.

Jon*_*eet 14

有没有办法进行"检查演员表"?

当然,虽然重要的是要注意它在这里并没有真正帮助你,因为你的方法B在一些地方被硬编码使用.您可以使用以下命令执行演员:

clazz.cast(test)
Run Code Online (Sandbox Code Playgroud)

......但是那会投B,而不是T.特别是假设我跑了:

public class C extends A {}

...

C c = foo.<C>getB();
Run Code Online (Sandbox Code Playgroud)

您希望如何工作?

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

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

那很好,因为clazz.cast会返回一个类型的值T,你可以返回.