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

时间:2014-09-24 16:58:47

标签: 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;
}

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

有没有办法进行“格式化演员表”?

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

1 个答案:

答案 0 :(得分:11)

  

有没有办法进行“格式化演员表”?

当然,虽然重要的是要注意它不会真正帮助您,因为您的方法在某些地方使用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类型的值,您可以返回。

相关问题