当前位置: 首页 > 知识库问答 >
问题:

为什么我在这里使用方法引用或lambda有关系呢?

昝阳嘉
2023-03-14

当我尝试编译这段代码时

import java.util.Optional;

public class GenericTest {

    public static void main(String[] args) {
        Optional.empty().map(o -> getStringClass(o)).orElse(String.class);
    }

    static Class<?> getStringClass(Object arg) {
        return String.class;
    }

}
GenericTest.java:6: error: method orElse in class Optional cannot be applied to given types;
                Optional.empty().map(o -> getStringClass(o)).orElse(String.class);
                                                            ^
  required: Class<CAP#1>
  found: Class<String>
  reason: argument mismatch; Class<String> cannot be converted to Class<CAP#1>
  where T is a type-variable:
    T extends Object declared in class Optional
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?
1 error
import java.util.Optional;

public class GenericTest {

    public static void main(String[] args) {
        Optional.empty().map(GenericTest::getStringClass).orElse(String.class);
    }

    static Class<?> getStringClass(Object arg) {
        return String.class;
    }

}

共有1个答案

锺英卫
2023-03-14

方法链接再次发生。您可以在这里读到为什么这个特性的设计者发现实现起来很复杂(这与lambda的/method引用是多表达式这一事实有关--它们的类型依赖于上下文)。这样的特性将会给编译器带来一些额外的负担--尽管您的示例需要解决的是一个相当琐碎的示例,但javac需要关心的不仅仅是琐碎;因此,即使在Java-12中也没有实现这一点。

IMO最简单的解决方案,因为这与方法链接有关(在您的情况下,这是可能的),所以不链接:

Optional<Class<?>> first = Optional.empty().map(o -> getStringClass(o));
Class<?> second = first.orElse(String.class);
 类似资料:
  • 这是我的密码 结果为上述结果之一。从调用仍然调用子类的,即使从词汇上讲,meth调用在超类内部!那么,当是私有的时候,为什么会有不同的行为呢? ___________edit____________ 代码是这样的吗 O/P将是 因此,即使超级类中的正在调用,但实际上子类的正在被调用。所以,方法调用不是词法意义上的!也就是说,即使看起来将调用超级类的meth,实际上它的子类的becoz子类实例首先调

  • 我理解这是指当前对象。所以,与其使用 为什么我不能使用 请参考下面的例子,并在最后看到最后两个评论。

  • 问题内容: 我有一个熊猫数据框,我想根据是否满足某些条件进行过滤。我跑了一个循环,然后用来测试速度。数据集大约有45000行。循环的代码片段为: 每个循环1.44 s±3.7毫秒(平均±标准偏差,共7次运行,每个循环1次) 而且是: 每个循环6.71 s±54.6 ms(平均±标准偏差,共7次运行,每个循环1次) 我认为应该比循环遍历大熊猫更快。有人可以解释为什么在这种情况下速度变慢吗? 问题答案

  • 问题内容: 我创建了一个用于显示工具提示的指令: 对应功能: 应用于此: 这是我观点的一部分,由拥有者的控制器处理 为什么必须调用才能将更改应用到,该更改是早先声明和初始化的? 问题答案: 因为附加到事件的回调超出了angular的范围;angular不知道该函数何时运行/结束,因此摘要循环永远不会运行。 调用或告诉angular更新绑定并触发任何手表。

  • 我遇到了这个代码 我在字段上看到过@autowire,它的意思是按类型自动连接,使用这个字段的类将获得特定类型的bean。 但是在上面的代码中,我不确定是谁在使用这个RootResource bean? 这是spring-泽西Rest项目。 据我所知,spring将创建RootResource的bean,将使用这个bean来设置它的属性。(我看不到此bean的任何显式配置) 我的问题是, 1)这个

  • 测试代码为: 测试代码为: 你知道怎么了吗?