如何在子类型上使用为泛型超类型声明的Guava函数?

时间:2014-07-31 16:17:08

标签: java generics guava

我知道标题不是非常具有描述性,但我无法想出更好的东西。这更多是关于我(缺乏)对仿制药的一般理解而不是关于番石榴。

假设我有这样的界面:

public interface HasId {
  String getId();
}

我有一个声明如下的函数:

private static Function<? extends HasId, String> getId = new Function<HasId, String>() {
    public String apply(HasId input) {
        return input.getId();
    }
};

为什么我不能在例如这样的排序(生成编译器错误,getId是错误的泛型类型):

List<String> ids = ...;
List<SomeTypeImplementingHasId> someStuff = ...;
Ordering<SomeTypeImplementingHasId> byIds = Ordering.explicit(ids).onResultOf(getId);
List<SomeTypeImplementingHasId> sortedByGivenIds = byIds.sortedCopy(someStuff);

我知道我可以使用这样的包装函数来实现它:

@SuppressWarnings("unchecked")
<T extends HasId> Function<T, String> getIdFunc() {
    return (Function<T, String>)getId;
}

但是有没有什么方法不需要这种未经检验的演员?

编辑这解决了我的问题,感谢@Natix&amp; @Jean Logeart:

我首先要在函数声明中删除通配符:

Function<HasId, String> getId = ...

然后我不得不改变我在超类上打字的顺序:

Ordering<HasId> byIds = Ordering.explicit(ids).onResultOf(getId);

1 个答案:

答案 0 :(得分:2)

你可以:

  • 声明Function<HasId, String> getId = ...
  • 声明Function<? super HasId, String> getId = ...

更多信息:What is PECS (Producer Extends Consumer Super)?