0

クラス内で定義されているBuilderクラスを取得するために使用できるGenericBuilderを作成したかったのです。次のインターフェイスとクラスを作成しました

public interface BuilderType<T> {
}

public class MyObject implements BuilderType<MyObject.MyObjectBuilder> {
private int i;
private MyObject() {}
public int getI() {
    return i;
}
public static MyObjectBuilder buildMyObject() {
    MyObjectBuilder builder = new MyObjectBuilder();
    return builder;
}
public static class MyObjectBuilder {
    private final MyObject obj;
    MyObjectBuilder() {
        obj = new MyObject();
    }
    public MyObjectBuilder withI(int i) {
        obj.i = i;
        return this;
    }
    public MyObject build() {
        return obj;
    }
}
public class GenericBuilder {
 public static <T extends BuilderType<S>, S> S getBuilder(Class<T> t) {
 S s = null;
 try {
     s = (S) t.getDeclaredMethod("build" + t.getSimpleName(), null)
                .invoke(null, null);
 } catch (Exception e) {
     e.printStackTrace();
 }
 return s;
 }
}

GenericBuilderのステートメントs=(S)t.get ...はキャスト警告を出します:オブジェクトからSへのチェックされていないキャスト、それを排除する方法はありますか?

4

1 に答える 1

3

Sは実数型ではないため、警告を消す方法はありません。実行時までに、上限まで消去されます。これはObjectあなたの場合です。したがって、「ダウンキャスト」は実際には何もしていません。Method適切なメソッドを呼び出して の戻り値の型を確認し、リフレクティブ ダウンキャストを実行できます (シナリオにはあまり役に立ちません)。実行時にメソッドを動的にフェッチする場合、タイプ セーフを実現できない可能性があります。

于 2012-11-30T13:28:41.967 に答える