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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何為泛型方法編寫(xiě)簡(jiǎn)潔的閉包?

如何為泛型方法編寫(xiě)簡(jiǎn)潔的閉包?

幕布斯7119047 2021-10-27 16:28:40
我想編寫(xiě)一個(gè)具有泛型方法的功能性非泛型接口的實(shí)現(xiàn)。實(shí)現(xiàn)需要是內(nèi)聯(lián)閉包和簡(jiǎn)潔的。作為一個(gè)簡(jiǎ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í)際上,該參數(shù)將是一個(gè)具有返回類(lèi)型為 的方法的通用接口R。)有沒(méi)有一種解決方法而不必回到匿名內(nèi)部類(lèi)的冗長(zhǎng)之處?有一個(gè)明顯的類(lèi)似的問(wèn)題,“不能轉(zhuǎn)換功能界面與通用方法引入lambda表達(dá)式”,但是從使用一個(gè)被稱(chēng)為類(lèi)型參數(shù)莖Integer,而不是其他傳統(tǒng)一樣T,和喬恩斯基特的接受的答案說(shuō),他不知道解決我的問(wèn)題。還有一個(gè)很長(zhǎng)的討論,“功能接口混淆”,沒(méi)有回答這個(gè)問(wèn)題。不可能是“這里最好使用冗長(zhǎng)的匿名內(nèi)部類(lèi)”,對(duì)嗎?
查看完整描述

2 回答

?
蕪湖不蕪

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

泛型 lambda 不合法,但泛型方法引用是合法的。您可以通過(guò)創(chuàng)建輔助方法來(lái)減少匿名類(lèi)的冗長(zhǎ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;

    }

}


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

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

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

這是想法

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

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

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

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

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

清除?【修辭】

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

Fn id = arg -> arg;

我們至少可以寫(xiě)

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

這是一個(gè) lambda lambda 工廠。

我們似乎語(yǔ)法用完了,不能寫(xiě)類(lèi)似的東西

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

總而言之(有一個(gè)主要表明我沒(méi)有作弊)

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)為我沒(méi)有利用類(lèi)型系統(tǒng)中的任何缺陷。


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


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號(hào)

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