0

我想创建一个 GenericBuilder,它可用于检索在我的类中定义的 Builder 类。我创建了以下接口和类

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... 给出了强制转换警告: Unchecked Cast from Object to S,有没有办法消除它?

4

1 回答 1

3

没有办法消除警告,因为S它不是真正的类型。到运行时,它将被擦除到它的上限,这就是Object你的情况。所以“沮丧”实际上并没有做任何事情。您可以通过调用适当的方法来检查Method' 的返回类型,然后进行反射向下转换(对您的方案不是很有帮助)。当您在运行时动态获取方法时,不可能实现类型安全。

于 2012-11-30T13:28:41.967 回答