我知道标题不是非常具有描述性,但我无法想出更好的东西。这更多是关于我(缺乏)对仿制药的一般理解而不是关于番石榴。
假设我有这样的界面:
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);
答案 0 :(得分:2)
你可以:
Function<HasId, String> getId = ...
Function<? super HasId, String> getId = ...