[英]Generic type instantiation and Lambdas
我正在使用匿名函數和函數接口,我有一個功能接口,它接受兩個相同類型的對象並返回true或false。
package elementutils;
@FunctionalInterface
public interface TwoElementPredicate <T> {
public boolean compare(T a, T b);
}
我使用另一個類中的函數接口來獲取使用匿名函數的“更好的元素”,方法betterElement接受兩個對象和功能接口的實例。 然后我應該能夠創建lambdas來比較main中相同類型的兩個對象。
package elementutils;
public class ElementUtils <T> {
public T betterElement(T a, T b, TwoElementPredicate elements){
if (elements.compare(a, b) == true) {
return a;
}else {
return b;
}
}
public static void main(String[] args) {
//String x= ElementUtils.betterElement("java", "python", (a, b) -> a.length() < b.length());
//int y= ElementUtils.betterElement(2, 3, (a, b) -> a > b);
//double z= ElementUtils.betterElement(2.5, 3.7, (a, b) -> a > b);
// all this give errors
}
}
這些函數應該使用任何對象,只要它們來自同一類型。 我以為我可以使用泛型類來實現它,但是當我實例化lambdas時,似乎元素總是類型為object,所以我不能使用length()並且不能將它們分配給String。
我希望我能正確解釋,任何幫助都將受到高度贊賞。
您缺少TwoElementPredicate
上的類型參數T
,因此您使用的是原始類型
您需要聲明類型為TwoElementPredicate<T>
的參數elements
您對betterElement
定義使用原始的TwoElementPredicate
,因此其參數將始終為Object
。 相反,您應該使用通用參數,使用與元素相同的T
:
public T betterElement(T a, T b, TwoElementPredicate<T> elements) {
// Here ----------------------------------------^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.