ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 为什么必须为方法引用显式指定类/对象名?

2019-05-28 10:48:32  阅读:318  来源: 互联网

标签:java java-8 method-reference


当我想参考当前范围内的方法时,我仍然需要
指定类名(对于静态方法)或之前::
操作符.例如,我需要写:

import java.util.stream.Stream;

public class StreamTest {
    public static int trimmedLength(String s) {
        return s.trim().length();
    }

    public static void main(String[] args) {
        System.out.println(Stream.of("  aaa  ", "  bb ", " c ")
                .mapToInt(StreamTest::trimmedLength).sum());
    }
}

这不是一个大问题,但有时看起来过于拥挤静态方法,因为类名可能很长.如果编译器允许我简单地编写:: trimmedLength,那将是很好的:

public static void main(String[] args) {
    System.out.println(Stream.of("  aaa  ", "  bb ", " c ")
            .mapToInt(::trimmedLength).sum());
}

但是Java-8编译器不允许这样做.对我来说,如果类/对象名称的解析方式与普通方法调用相同,那么它似乎会非常一致.这也将支持方法引用的静态导入,这在某些情况下也很有用.

所以问题是为什么在Java 8中没有实现这样或类似的语法?这种语法会出现什么问题吗?或者根本不考虑它?

解决方法:

我不能代表Java开发人员,但有一些事情需要考虑:

有一定的kind of method references

>参考静态方法,例如ContainingClass :: staticMethodName
>引用特定对象的实例方法,例如containingObject :: instanceMethodName
>引用特定类型的任意对象的实例方法,例如, ContainingType ::方法名
>对构造函数的引用,例如类名::新

编译器必须做一些工作来消除形式1和3以及sometimes it fails的歧义.如果允许使用form :: methodName,则编译器必须消除三种不同形式之间的歧义,因为它可以是从1到3的三种形式中的任何一种.

也就是说,允许form :: methodName快捷地删除任何形式1到3仍然不会暗示它等同于formName(…)形式,因为表达式simpleName(argopt)可能引用

>当前类或其超类和接口范围内的实例方法
>当前类或其超类范围内的静态方法
>外部类或其超类和接口范围内的实例方法
>外部类或其超类范围内的静态方法
>通过import static声明的静态方法

所以说“:: name应该被允许引用任何方法名称(…)”可能会引用“暗示结合这两个列表的可能性,你应该在做出愿望之前三思而后行.

最后一点,您仍然可以选择编写像args这样的lambda表达式 – > name(args)意味着解析名称,就像表单名称(args)的简单方法调用一样,同时解决歧义问题,因为它消除了方法引用类型的选项3,除非你明确写入(arg1,otherargs) – &GT arg1.name(值其它参数).

标签:java,java-8,method-reference
来源: https://codeday.me/bug/20190528/1170500.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有