1. ホーム
  2. java

[解決済み] チェックドキャストを行うには?

2022-03-14 06:57:04

質問

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;
}

この場合、Unchecked cast の警告が発生します。 return (T)test; という行があります。 の行で型をチェックしていますが、明らかに if (clazz.isInstance(test)) という行があります。

チェック済みキャスト("checked cast")を行う方法はありますか?

警告を抑制するだけでなく、実際にチェックしたキャストを実装したいと考えています。 残念ながら、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 を返すのは問題ない。