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;
}
}

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ō)明您為什么要這樣做。)
添加回答
舉報(bào)