gpt4 book ai didi

java - 如何在子类型上使用为通用父类(super class)型声明的 Guava 函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:49 24 4
gpt4 key购买 nike

我知道标题的描述性不强,但我真的想不出更好的东西。这更多是关于我(缺乏)对泛型的一般理解,而不是关于 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 和@Jean Logeart:

我首先必须去掉函数声明中的通配符:

Function<HasId, String> getId = ...

然后我不得不更改我的顺序以在父类(super class)上输入:

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

最佳答案

您可以:

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

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

关于java - 如何在子类型上使用为通用父类(super class)型声明的 Guava 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25064083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com