interface Func<A> {
double apply(Optional<A> a);
}
class Foo {
public double compute(Func<Double> f) {
// Sometimes amend the function to do something slightly different
Func<Double> g = f;
if (someCondition())
g = oa -> Math.max(0, f.apply(oa));
return g.apply(Optional.of(3.14)) + g.apply(Optional.empty());
}
}
public double compute(Func<? super Double> f) {
Func<? super Double> g = f;
if (someCondition())
g = oa -> Math.max(0, f.apply(oa));
...
将F
本身赋值给G
似乎并不让编译器担心,而且如果apply
的参数是a
而不是option
时,也不会出现问题。
不幸的是,似乎没有一种方法来命名?super double
参数类型,这样我就可以再次将其用作G
的类型和/或用一个老式的内部类替换lambda。
public <T super Double> double compute(Func<T> f) {
Func<T> g = f;
...
public double compute(Func<? super Double> f) {
if (someCondition())
return computeInner(oa -> Math.max(0, f.apply(oa)));
else
return computeInner(f);
}
private double computeInner(Func<? super Double> g) {
return g.apply(Optional.of(3.14)) + g.apply(Optional.empty());
}
编译器接受这一点,但出于让类型检查器高兴的原因而进行的间接调用并不是我所说的真正优雅的调用。
试试这个奇怪的把戏:
g = oa -> Math.max(0, f.apply(oa.map(a -> a)));
// ^----------^
像这样映射可选对象的类型允许编译器将可选对象的类型“强制转换”为一致的类型。
IdeOne演示
问题内容: 我知道Go将来不会有泛型,并且有一些建议可以用其他结构代替它们。但是在下面的例子中,我陷入了困境。 您可能会猜到,我试图使任何错误均告失败,并且希望将任何返回两个结果的函数放到第二个错误中。这工作正常,但丢失了它的类型信息,并且结果中只是一个空接口。 由于我也正在调用lib函数,因此我看不到使用Interfaces或Reflection解决此问题的方法。 有任何想法吗?我是完全走错了道
这可能是一个很傻的问题,但我挠头了很久也弄不明白其中的区别。 我正在浏览scala泛型页面:https://docs.scala-lang.org/tour/generic-classes.html 注意:泛型类型的子类型是不变的。这意味着,如果我们有一个stack[Char]类型的字符堆栈,那么它就不能用作stack[Int]类型的整数堆栈。这是不合理的,因为它使我们能够将真整数输入到字符堆栈中
这个问题用泛型约束标记为重复,where T:struct和where T:class和旧标题,它是。所以我更新了标题,以便更好地表达我的问题。我想问的是,如何调用泛型方法并仅在参数不为null的情况下才使用该参数,而不使用装箱。 一些为链接问题解释的变通方法可以用来回答这个问题,但我仍然相信这是一个根本不同的问题。
问题内容: 我最近开始学习Scala,但对它们的泛型也通过类型擦除实现感到失望(但并不感到惊讶)。 我的问题是,Scala是否可以使用通用化泛型,或者需要以某种方式更改JVM?如果确实需要更改JVM,则到底需要更改什么? 问题答案: 否-如果该Scala字节码不支持统一的泛型,则Scala不可能作为Java等效字节码运行。 当您问 “需要更改什么?”时 ,答案是: 字节码规范 。当前,字节码不允许
问题内容: 考虑私有C函数,该函数返回当前设备屏幕的快照: 我可以将其放在桥接标头中,然后在Swift中访问它,如下所示: MyApp-Bridging-Header.h MyClass.swift 有没有一种方法可以在不使用桥接头的情况下在纯Swift中访问? 最初的想法是在上创建扩展,但是该扩展希望我在扩展中声明函数的主体: 无论如何,这种实现都是有缺陷的,因为上没有方法。 在纯Swift中是
此代码只是使用中间的来删除重复项,其中元素之间的相等性是根据提供的比较器定义的。 让我们给局部类型推断一个机会吧,我(天真地)想...于是我将上面的代码改为: 这对我来说是有意义的,因为的类型可以从的类型推断出来,或者我是这么想的。但是,修改后的代码无法编译,并生成以下错误: 注意1:编译代码的一种方法是将返回类型更改为。不过,那是一套很难用的... 注意2:另一种方法是在比较器中不使用逆变,但我