5

我有一个静态方法,它将根据类的类型返回一个自定义类型,

public class GenericMethod {

    public static <T> T returnGeneric(Class<T> clazz) {
        return null;
    }

}

现在,我想将一个具有泛型类型的类传递给它,

CustomType<String> type = GenericMethod.returnGeneric(CustomType.class);

唯一的问题是上述语句给出了未经检查的转换警告。

我尝试了new CustomType<String>().getName()也没有解决问题的解决方法。

有没有正确的方法,或者唯一的解决方案是使用@SuppressWarnings

4

4 回答 4

1

你想/应该尝试的是:

CustomType<String> type = GenericMethod.returnGeneric(CustomType<String>.class);

CustomType<A>.class不幸的是,由于类型擦除,和之间没有区别CustomType<B>.class,因此 Java 不支持这种语法。

所以我的 $.02:你所要求的是不可能的,所以坚持@suppresswarnings ...

于 2013-10-30T09:00:53.273 回答
1

最好的方法是使用包装方法并将所有警告放在一个地方。

并且术语“未检查”意味着编译器没有足够的类型信息来执行确保类型安全所需的所有类型检查。

于 2013-10-30T09:03:18.293 回答
0

从理论上讲,由于类型擦除,您无法做到这一点。

但在实践中;)您可以这样做,因为信息实际上在 .class 文件中。我知道的最简单的方法是使用 Spring 的GenericTypeResolver.

看看它。

于 2013-10-30T09:05:13.640 回答
0

正如你所说的@Simeon“理论上你不能这样做,因为类型擦除”。仅当您具有以下子类时才能使用它CustomType

class GenericMethod {

  public static <T> T returnGeneric(Class<T> clazz) {
    try {
      return  clazz.newInstance();
    } catch (InstantiationException | IllegalAccessException e) {
      e.printStackTrace();
    }
    return null;
  }

  public static void main(String [] args){
    CustomeType<String> ct = returnGeneric(StringCustomeType.class);
    System.out.println(ct);
  }
}

class StringCustomeType extends CustomeType<String> {
}

class CustomeType<T> {
}
于 2013-10-30T09:07:35.683 回答