我定義了一個采用方法參考的列舉:
enum class Op(val param: (Expression<String>, String) -> Predicate) {
GREATER_THAN(CriteriaBuilder::greaterThan)
}
類中有兩個候選者CriteriaBuilder,編譯器無法弄清楚我的意思是哪一個(“多載解析度歧義。所有這些函式都匹配。”):
<Y extends Comparable<? super Y>> Predicate greaterThan(Expression<? extends Y> x, Expression<? extends Y> y);
<Y extends Comparable<? super Y>> Predicate greaterThan(Expression<? extends Y> x, Y y);
為什么 Kotlin 不能推斷出正確的型別?顯然第一種方法是不可能的。我不知道如何引導編譯器,將其轉換為正確的型別似乎不起作用:
GREATER_THAN(CriteriaBuilder::greaterThan as (Expression<String>, String) -> Predicate)
編譯器抱怨“在未完成型別推斷的情況下無法在以下候選中進行選擇”。
uj5u.com熱心網友回復:
鑒于 的JavadocCriteriaBuilder,您所指的方法不是靜態的。
由于您沒有CriteriaBuilder在函式參考中提供的實體,這意味著除了 2 個引數之外,它CriteriaBuilder::greaterThan實際上還需要一個型別的接收器或引數CriteriaBuilder,這與您期望的簽名不匹配:(Expression<String>, String) -> Predicate.
如果您希望呼叫者Op.param提供標準構建器實體,那么我建議將Op.param的型別更改為(CriteriaBuilder, Expression<String>, String) -> Predicateor CriteriaBuilder.(Expression<String>, String) -> Predicate- 這將與函式參考匹配CriteriaBuilder::greaterThan。選擇使用哪一個取決于您要如何稱呼它:
enum class Op(val param: CriteriaBuilder.(Expression<String>, String) -> Predicate) {
GREATER_THAN(CriteriaBuilder::greaterThan)
}
// or
enum class Op(val param: (CriteriaBuilder, Expression<String>, String) -> Predicate) {
GREATER_THAN(CriteriaBuilder::greaterThan)
}
如果您想擁有CriteriaBuilder“內置”列舉,您可以預先實體化它,然后在函式參考中使用您的特定實體:
val yourCriteriaBuilder: CriteriaBuilder = TODO("create it somehow")
enum class Op(val param: (Expression<String>, String) -> Predicate) {
GREATER_THAN(yourCriteriaBuilder::greaterThan)
}
我不熟悉CriteriaBuilderAPI,所以我不確定最后一個選項是否真的可取。您可能每次都需要新實體 - 您的電話。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/432523.html
標籤:科特林
