在Java中获得泛型的通用

时间:2015-12-31 22:49:18

标签: java generics

我上课了。它将是简单容器,可能包含某些类型T和类型Optional<T>(guava Optional link) 使用Container.of(T)没有问题。但是,如何创建Container.ofOptional(T)
这是我的班级:

public final class Container<T>{
  Class<?> firstClass;
  Class<T> seconClass;

  Container(Class<?> first, Class<T> second){
    this.firstClass = first;
    this.seconClass = second;
  }

  public static <T> Container<T> of(Class<?> first, Class<T> second){
    return new Container(first, second);
  }

  public static <T> Container<Optional<T>> ofOptional(Class<?> first, Class<T> second){
    return of(first, <what should I pass here>);
  }
}

我试过了Optional.of(second),但它没有用。

因此,在结果中,我希望方法Container.ofOptional(T)返回Container<Optional<T>>

1 个答案:

答案 0 :(得分:3)

由于type erasure,这并不合理。只有一个{ .... updateButton(session, "myBtn", "New Label") .... } - Optional.classOptional.of("foo").getClass()都返回相同的实例 - 所以尽管你可以通过大量的转换获得Optional.of(3).getClass()类型的表达式,但是runtime-type必然是Class<Optional<T>>(或者只是null),所以你不能做任何真正有用的事情。

所以你问题的简单答案是你可以写

Class<Optional>

但真正的答案是你不应该这样做。

(您可能希望发布一个关于真正的问题的新问题 - public static <T> Container<Optional<T>> ofOptional(Class<?> first, Class<T> second){ return of(first, (Class<Optional<T>>) (Class) Optional.class); } 正试图解决的问题 - 也许有人可以帮助您找到更好的方法。)< / p>