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

方法参考铸造是如何工作的?

汝吕恭
2023-03-14
public class Main {
    interface Capitalizer {
        public String capitalize(String name);
    }

    public String toUpperCase() {
        return "ALLCAPS";
    }

    public static void main(String[] args) {
        Capitalizer c = String::toUpperCase; //This works
        c = Main::toUpperCase; //Compile error
    }
}

两者都是具有相同签名的实例方法。为什么一个有效,另一个无效?

String::toUpperCase的签名:String toUpperCase()


共有3个答案

昌勇锐
2023-03-14

你应该改变:

public String toUpperCase()

public static String toUpperCase(String text)

您应该阅读关于方法引用的java教程。不同类型的方法引用,还有一个类似的例子,String::compareToIgnoreCase(引用特定类型的任意对象的实例方法)。

方法引用String::compareToIgnoreCase的等效lambda表达式将具有形式参数列表(字符串a、字符串b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用方法a.compareToIgnoreCase(b)。

东方英豪
2023-03-14

你有一个方法

public String capitalize(String name);

获取字符串并返回字符串。这种方法可以有许多模式

构造函数

c = String::new; // calls new String(String)
// or
c = s -> new String(s);

String上的一个函数,不接受参数

c = String::toLowerCase; // instance method String::toLowerCase()
// or
c = s -> s.toLowerCase();

将字符串作为唯一参数的方法的

// method which takes a String, but not a Main
public static String toUpperCase(String str) { 

c = Main::toUpperCase;
// or
c = s -> toUpperCase(s);

在任何情况下,引用的方法都必须采用字符串。

如果没有,你可以这样做。

c = s -> capitalize(); // assuming Main.capitalize() is static

这告诉编译器忽略输入。

卜季萌
2023-03-14

有3个结构可以引用方法:

  1. 对象::instanceMethod
  2. 类::静态方法
  3. 类::instanceMethod

线路:

Capitalizer c = String::toUpperCase; //This works

使用3'rd构造-Class::instanceMethod。在这种情况下,第一个参数成为方法的目标。该构造等价于(翻译)以下Lambda:

Capitalizer = (String x) -> x.toUpperCase();

此Lambda表达式有效,因为Lambda获取String作为参数并返回String结果-如Capital alizer接口所要求的。

线路:

c = Main::toUpperCase; //Compile error

翻译为:

(Main m) ->  m.toUpperCase();

它不适用于Capital alizer接口。您可以通过将Capital alizer更改为:

interface Capitalizer {
    public String capitalize(Main name);
}

在此更改后,将编译Main::toUpperCase。

 类似资料:
  • 当我从Cloud Foundry博客中读到以下内容时,我正试图弄清楚如何使用微CloudFoundry进行开发: “您不需要安装web服务器(Tomcat等)、运行时(Java、Ruby等)和服务(Postgres、MongoDB等),只需下载Micro Cloud Foundry,启动它,然后使用”VMC Push“部署应用程序。” 在开发过程中不断调用“VMC push”对我来说几乎是不可能的

  • 我是从C++模板编程来的,有时会对泛型感到很困惑。由于没有方法专门化,我尝试使用了强制转换。以下是我的资料: 这不编译。 有什么办法可以让我做这个演员吗? 我想这样做的原因是:在C++模板中,我会为所支持的类型进行专门化,并创建一个抛出异常的非专门化版本。 其基本思想是:具有泛型方法的非泛型接口。尝试使用正确的类型获取值应该有效,尝试使用错误的类型则可能引发。 我们应该保持类型安全,所以我需要返回

  • 我目前在辅导一个高中生AP Java,她问了我一个关于“双选”的问题。我以前从未听说过这个术语,但显然她的老师希望她在即将到来的期末考试中知道这个术语。 她的老师提供的例子是,如果你想将一个整数转换成一个字符串,你必须执行以下操作才能避免编译器错误: 问题是:你想在现实生活中什么时候这样做? 老师只提供了导致运行时错误的示例。此外,我从来不知道有一个术语,但这样做似乎是个坏主意,因为只有当两种类型

  • 问题内容: 我试图将选择的A类“获取”方法传递给B类中的方法。我已经将Java PassMethod作为Parameter签出,但是我无法以合理的方式采用接口方法解决问题。我宁愿 不 使用Java 8(lambdas),并尽可能避免反射。我的感觉是,我以错误的方式看待自己的问题。这是我要完成的工作的特定简化示例: 我有一个包含一些字段和get-method的类: 接下来,我将主类实例化为Map的V

  • 我正在使用JSP、JSTL和Java servlet创建登录/注册页面,并且在servlet的doPost()方法中使用: 当用户从索引中输入无效的登录凭据时发出警报。jsp。 这是有效的,但我不知道为什么有效;以下是我的问题: > 据我所知,我正在将请求和响应对象转发到索引。但是jsp页面如何处理这些对象呢?它是一堆html,响应对象也会被修改,以便包含索引的所有html代码。jsp? 为什么g