Java泛型和转换泛型类型

时间:2013-09-06 20:43:28

标签: java generics guava

我正在尝试使用guava创建一个类似的,我只关心一个类的一个字段(由集合用于排序)。该字段是通用的,可以采用任何类型。我正在使用guava的Ordering#on​​ResultOf方法将包装器对象转换为泛型类型,并为该类型提供可比较的类型。

我有以下代码:

  private static final class Reference<T> { ... }
  ...
  public static <T> Function<Reference<T>, T> referenceToData() {
    return (Function<Reference<T>, T>) ToData.INSTANCE;
  }

  private enum ToData implements Function<Reference<Object>, Object> {
    INSTANCE;

    @Override
    public Object apply(final ComparatorMerger.Reference<Object> input) {
      return input.data;
    }
  }

编译代码时出现以下错误:

[ERROR] ... inconvertible types
[ERROR] found   : Reference.ToData
[ERROR] required: com.google.common.base.Function<Reference<T>,T>

我不知道如何让演员按照我想要的方式工作。有什么建议?

1 个答案:

答案 0 :(得分:3)

你需要进行双重演员:

return (Function<Reference<T>, T>)(Function<?, ?>)ToData.INSTANCE;

另请参阅我的recent answer使用此模式(来自Joshua Bloch的Effective Java第27项,“赞成通用方法”)作为有效未经检查的强制转换的示例。

正如我指出的那样,你还应该考虑禁止未经检查的强制警告:

@SuppressWarnings("unchecked") // this is safe for any T
final Function<Reference<T>, T> withNarrowedTypes =
        (Function<Reference<T>, T>)(Function<?, ?>)ToData.INSTANCE;
return withNarrowedTypes;