第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何為泛型方法編寫簡潔的閉包?

如何為泛型方法編寫簡潔的閉包?

幕布斯7119047 2021-10-27 16:28:40
我想編寫一個具有泛型方法的功能性非泛型接口的實現(xiàn)。實現(xiàn)需要是內(nèi)聯(lián)閉包和簡潔的。作為一個簡化的例子@FunctionalInterface interface Fn {    <R> R fn(R arg);}public class Scratch {    Fn id = arg -> arg;    //Fn nul = arg -> null;    //Fn requiresNonNull = ...}這使/Scratch.java:5: error: incompatible types: invalid functional descriptor for lambda expression    Fn id = arg -> arg;            ^    method <R>(R)R in interface Fn is generic  where R is a type-variable:    R extends Object declared in method <R>fn(R)1 error(實際上,該參數(shù)將是一個具有返回類型為 的方法的通用接口R。)有沒有一種解決方法而不必回到匿名內(nèi)部類的冗長之處?有一個明顯的類似的問題,“不能轉(zhuǎn)換功能界面與通用方法引入lambda表達(dá)式”,但是從使用一個被稱為類型參數(shù)莖Integer,而不是其他傳統(tǒng)一樣T,和喬恩斯基特的接受的答案說,他不知道解決我的問題。還有一個很長的討論,“功能接口混淆”,沒有回答這個問題。不可能是“這里最好使用冗長的匿名內(nèi)部類”,對嗎?
查看完整描述

2 回答

?
蕪湖不蕪

TA貢獻(xiàn)1796條經(jīng)驗 獲得超7個贊

泛型 lambda 不合法,但泛型方法引用是合法的。您可以通過創(chuàng)建輔助方法來減少匿名類的冗長:


public class Scratch {

    Fn id = Scratch::id;

    Fn nul = Scratch::nul;

    Fn requiresNotNull = Objects::requireNonNull;


    private static <R> R id(R arg) {

        return arg;

    }


    private static <R> R nul(R arg) {

        return null;

    }

}


查看完整回答
反對 回復(fù) 2021-10-27
?
慕的地10843

TA貢獻(xiàn)1785條經(jīng)驗 獲得超8個贊

經(jīng)過大量實驗和間接操作后,我有了一個解決方案。我在命名方面不太成功。

這是想法

  • 函數(shù)式接口和單個抽象方法都沒有類型參數(shù)。

  • 函數(shù)式接口接收具有類型參數(shù)但在方法參數(shù)中使用通配符的使用者。

  • 消費者只是一塊內(nèi)部gubbins,但它確實具有該類型參數(shù)。它用于在執(zhí)行通過封閉函數(shù)返回時存儲結(jié)果。

  • 消費者本身接收一個包含實際業(yè)務(wù)功能實例的功能接口,該實例屬于參數(shù)化類型。

  • 有一個默認(rèn)方法可以將事物聯(lián)系在一起,包括創(chuàng)建使用者。

清除?【修辭】

所以,而不是能夠?qū)?/p>

Fn id = arg -> arg;

我們至少可以寫

Fn id = q -> q.q(arg -> arg);

這是一個 lambda lambda 工廠。

我們似乎語法用完了,不能寫類似的東西

Fn id = Fn.Consumer::q(arg -> arg); // not valid syntax!

總而言之(有一個主要表明我沒有作弊)

import java.util.concurrent.atomic.*;


@FunctionalInterface interface Fn {

    interface Instance<R> {

        R fn(R arg);

    }

    interface Consumer<R> {

       void q(Instance<R> gn);

    }


    void consume(Consumer<?> consumer);


    default <R> R fn(R arg) {

        AtomicReference<R> result = new AtomicReference<>();

        this.consume((Instance<R> instance) -> { result.set(instance.fn(arg)); });

        return result.get();

    }

}


public interface Scratch {

    Fn id = q -> q.q(arg -> arg);

    Fn nul = q -> q.q(arg -> null);


    public static void main(String[] args) {

        String idStr = id.fn("cruel");

        String nulStr = nul.fn("cruel");


        System.err.println(idStr);

        System.err.println(nulStr);

    }

}

我認(rèn)為我沒有利用類型系統(tǒng)中的任何缺陷。


(我可能應(yīng)該在問題中添加一個更復(fù)雜的示例,以說明您為什么要這樣做。)


查看完整回答
反對 回復(fù) 2021-10-27
  • 2 回答
  • 0 關(guān)注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號