2

这是一个使用 Javassist 动态生成类的代码。

public class ClassGenerator {

    // ...

    public Class<? extends Base> generateClass(MetaData md) {
         // Call javassist api and returns a generated on the fly class...
    }
}

在后面的代码中,有

public class GeneratorClient implements IClient<Base> {
   private Class<Base> clazz;

   public void init() {
      MetaData myMd = ...;

      clazz = generator.generateClass(myMd);

      // ...
   }

   public Base getClazz() {
       return clazz;
   }
}

public interface IClient<T extends Base> {
    T getClazz();
}

显然,编译器会在此处引发错误。投射会引发警告(“Uncheked cast ...”) ......

抑制警告不是一种选择。

我也写不出来:public class GeneratorClient implements IClient<? extends Base>

如何更改的返回类型ClassGenerator#generateClass

JDK 6

4

1 回答 1

3

GeneratorClient将您的声明更改为:

public class GeneratorClient<T extends Base> 
    implements IClient<T>
{
    private final Class<T> clazz;
    // etc

这应该这样做。

编辑由于您只在运行时知道该类,因此添加一个静态工厂方法来构建您的GeneratorClient

public static <T extends Base> GeneratorClient<T> forClass(final Class<T>)
{
    return new GeneratorClient<T>(whatever, args, are, needed, if, any);
}

在代码中:

final GeneratorClient<MyClass> = GeneratorClient.forClass(MyClass.class);
于 2013-06-19T09:51:40.880 回答