如何在Java中删除带有泛型的通配符返回类型?

时间:2013-06-19 09:35:57

标签: java generics javassist

这是一个使用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

1 个答案:

答案 0 :(得分: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);