簡體   English   中英

通用類型實例化和Lambdas

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM