首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么从扩展类中调用扩展方法需要'this'关键字

从扩展类中调用扩展方法需要使用'this'关键字是因为扩展方法本质上是静态方法,它们是在扩展类的外部定义的。当我们在扩展类中调用扩展方法时,编译器会将调用转换为对静态方法的调用。

使用'this'关键字可以明确指示编译器将方法调用解析为扩展方法,而不是类中的普通方法。这是因为在扩展方法的定义中,第一个参数是扩展方法所扩展的类型,而'this'关键字则表示该类型的实例。

通过使用'this'关键字,我们可以在扩展类中像调用普通方法一样调用扩展方法,而无需显式传递实例作为参数。这样可以提高代码的可读性和简洁性。

需要注意的是,扩展方法只能通过实例进行调用,而不能通过类型进行调用。这是因为扩展方法是在扩展类的外部定义的,编译器无法将类型直接与扩展方法关联起来。

总结起来,从扩展类中调用扩展方法需要使用'this'关键字是为了明确指示编译器将方法调用解析为扩展方法,并提高代码的可读性和简洁性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Groovy】Groovy 扩展方法 ( 静态扩展方法配置 | 扩展方法示例 | 编译静态扩展 | 打包静态扩展字节码到 jar 包 | 测试使用 Thread 静态扩展 )

文章目录 一、扩展方法示例 二、静态扩展方法配置 三、编译静态扩展 四、打包静态扩展字节码到 jar 包 五、测试使用 Thread 静态扩展 一、扩展方法示例 ---- 为 Thread 扩展..., extensionClasses 用于配置 实例扩展方法 ; 这里配置的是 静态扩展方法 ; 配置完成后的项目结构如下 : 三、编译静态扩展 ---- 在 Terminal 面板 , 执行...源码到 classes 目录 ; 其中 ThreadExt.groovy 定义了 Thread 扩展方法 ; 编译过程及结果如下 : 四、打包静态扩展字节码到 jar 包 ---- 在...命令 , 将 classes 的字节码文件按照 manifest/ 规则 , 打包到 thread.jar 文件 ; 五、测试使用 Thread 静态扩展 ---- 创建一个 Groovy 脚本..., 执行为 Thread 扩展的静态方法 hello 方法 ; Thread.hello{ printf "Hello" } 在 Terminal 面临 , 使用命令行执行该 Groovy

1.1K20

【Groovy】Groovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展 | 打包实例扩展字节码到 jar 包 | 测试使用 Thread 实例扩展方法 )

文章目录 一、扩展方法示例 二、实例扩展方法配置 三、编译实例扩展 四、打包静态扩展字节码到 jar 包 五、测试使用 Thread 实例扩展方法 一、扩展方法示例 ---- 为 Thread 扩展..., extensionClasses 用于配置 实例扩展方法 ; 这里配置的是 实例扩展方法 ; 配置完成后的项目结构如下 : 三、编译实例扩展 ---- 在 Terminal 面板 , 执行...源码到 classes 目录 ; 其中 ThreadExt.groovy 定义了 Thread 扩展方法 ; 编译过程及结果如下 : 四、打包静态扩展字节码到 jar 包 ---- 在...命令 , 将 classes 的字节码文件按照 manifest/ 规则 , 打包到 thread.jar 文件 ; 五、测试使用 Thread 实例扩展方法 ---- 创建一个 Groovy 脚本..., 执行为 Thread 扩展的静态方法 hello 方法 ; new Thread().hello{ printf "Hello" } 在 Terminal 面临 , 使用命令行执行该 Groovy

81240
  • 【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy Thread 的 start 扩展方法 )

    文章目录 一、Groovy 扩展方法引入 二、 分析 Groovy Thread 的 start 扩展方法 一、Groovy 扩展方法引入 ---- Groovy 可以对 JDK 的一些进行...的 start 扩展方法 ---- 分析该为 Thread 扩展的 start 扩展方法 , 扩展方法定义在了 DefaultGroovyStaticMethods ; 该 start 方法接收一个...Thread self 线程对象 参数 和 Closure closure 闭包参数 ; 指定为哪个定义扩展方法 : 第一个参数 Thread self , 表示只能在 Thread 对象上调用该...start 扩展方法 , 其它非 Thread 类型的对象 , 无法调用该 start 方法 ; 指定扩展方法的参数 : 第二个参数 Closure closure , 表示为 Thread 扩展的...start 方法参数是 闭包 类型 ; Thread 的 start 扩展方法 源码 : /** * 这个定义了groovy环境普通JDK上出现的所有新的静态groovy方法

    1.5K30

    【错误记录】Groovy 扩展方法调用报错 ( 静态扩展方法 或 实例扩展方法 需要分别配置 | 没有配置调用会报错 groovy.lang.MissingMethodException )

    文章目录 一、报错信息 二、解决方案 一、报错信息 ---- 定义 Thread 扩展方法 , 下面的扩展方法 class ThreadExt { public static Thread hello..., 只配置了 moduleName=groovyExt moduleVersion=1.0 extensionClasses=ThreadExt 对象实例扩展方法 , 在 Groovy 脚本调用 Thread...静态扩展方法 , Thread.hello{ printf "Hello" } 报如下错误 : HelloCaught: groovy.lang.MissingMethodException:...=ThreadExt 执行 groovyc -d classes ThreadExt.groovy 编译扩展 , 执行 jar -cf thread.jar -C classes ....将编译后的扩展字节码文件进行打包 , 执行 groovy -classpath thread.jar ThreadExtApplication.groovy 命令 , 执行 ThreadExtApplication.groovy

    64510

    C# this关键字(给底层扩展成员方法)

    string添加了两个实例重载方法,但是需要注意,这里的必须就静态,扩展方法必须是静态方法,原因如下: (1)、这里传入的需要扩展的string类型 ?...而且静态不能有成员变量,this关键字是个列外 (3)、当是静态时,程序会在编译的时候,就将所有的静态成员编译到全局环境,当不是静态的时候,只有当的静态成员被调用之后,才会被初始化到全局环境...所以只要当StringUtilities的FormatWith在被初始化之后,他才会被初始化到全局环境,下一次调用就不需要初始化了直接去全局环境取,所以这个时候 ?...ok,说明实例方法扩展成功 总结:上面的扩展方法调用方式,看上去像是成员方法,但实际编译器会对this关键字做特殊处理,编译器生成的中间语言(IL)会将代码转换为对静态方法调用, 因此,并未真正违反封装原则...实际上,扩展方法无法访问它们所扩展的类型的私有变量,不信你可以试试在扩展方法访问string的私有成员!!!

    1.1K70

    扩展方法必须在非泛型静态定义

    : using ExtensionMethods; 而且,可以使用以下语法应用程序调用扩展方法: string s = "Hello Extension Methods"; int i = s.WordCount...(); 在代码,可以使用实例方法语法调用扩展方法。 ...由于扩展方法是使用实例方法语法调用的,因此不需要任何特殊知识即可从客户端代码中使用它们。 若要为特定类型启用扩展方法,只需为在其中定义这些方法的命名空间添加 using 指令。 ...与接口或方法具有相同名称和签名的扩展方法永远不会被调用。 编译时,扩展方法的优先级总是比类型本身定义的实例方法低。 ...在使用扩展方法扩展你无法更改其源代码的类型时,你需要承受该类型实现的更改会导致扩展方法失效的风险。

    1.9K10

    Asp.Net MVC对HtmlHelper的自定义扩展方法以及如何调用

    c# 扩展方法出来已久,介绍扩展方法的文章也很多,此处就不多介绍,如有不懂当然可以百度,google一下,园子当中也有超级多的讲解。 ?...大家可以看到这是微软MVC自带的针对TextBoxFor的三个重载方法。那么我们还可以针对TextBoxFor进行我们自定义的扩展(想要什么样式,只要我们能实现),那么在调用时就方便多了。...它不会与系统自带的冲突,因为他们虽然方法名一样,但是参数类型不太一样,这个在自己扩展的时候注意一下就可以了。 我们调用一下试试 ?...当然我们调用之前应该要引用的,这里提供三种方法进行引用: 第一种:在相对应的视图View中进行页面引用即可 @using 命名空间 第二种:可以在web.config中进行配置,那么就不需要在视图中进行引用...命名空间名称"/> 第三种:看一下框架自带的方法所在命名空间

    1.5K10

    .NET那些所谓的新语法之二:匿名、匿名方法扩展方法

    这里的“添加”之所以使用引号,是因为并没有真正地向指定类型添加方法。   那么,有时候我们会问:为什么要有扩展方法呢?这里,我们可以顾名思义地想一下,扩展扩展,那么肯定是涉及到可扩展性。...在抽象工厂模式,我们可以通过新增一个工厂,而不需要更改源代码就可以切换到新的工厂。这里也是如此,在不修改源码的情况下,为某个增加新的方法,也就实现了扩展。   ...于是,我们可以总结出,扩展方法的三个要素是:静态、静态方法以及this关键字。...  e) 第一个参数不能是指针类型   (2)当我们把扩展方法定义到其它程序集中时,一定要注意调用扩展方法的环境需要包含扩展方法所在的命名空间!...(3)如果要扩展本来就有和扩展方法的名称一样的方法,到底会调用成员方法还是扩展方法呢?

    83330

    PHP的MySQLi扩展学习(二)mysqli的一些少见的属性方法

    虽说是少见的一些属性方法,但是可能还是有不少同学在日常的开发中使用过,这里只是学习了可能相对来说我们用得比较少的一些 mysqli 的属性或方法。就当是扩展一下自己的知识体系。...获取数据库字符var_dump($mysqli->character_set_name()); // string(4) "utf8" character_set_name() 不要以为看到一个 set 关键字就是设置或者修改什么...,这个方法是获取当前的字符集信息的。...在这里,我们就先看看 mysqli 关于 MySQL 线程的几个属性和方法吧。...大家可以仔细地研究一下这个对象的这些属性,或许某些内容就是你在实际项目中所需要的。 总结 今天的文章学习的就是一些简单的 mysqli 所持有的属性和方法

    2.2K00

    PHP的MySQLi扩展学习(二)mysqli的一些少见的属性方法

    PHP的MySQLi扩展学习(二)mysqli的一些少见的属性方法 虽说是少见的一些属性方法,但是可能还是有不少同学在日常的开发中使用过,这里只是学习了可能相对来说我们用得比较少的一些 mysqli...在这里,我们就先看看 mysqli 关于 MySQL 线程的几个属性和方法吧。...大家可以仔细地研究一下这个对象的这些属性,或许某些内容就是你在实际项目中所需要的。 总结 今天的文章学习的就是一些简单的 mysqli 所持有的属性和方法。...测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/5.PHP的MySQLi扩展学习(二)mysqli...的一些少见的属性方法.php 参考文档: https://www.php.net/manual/zh/book.mysqli.php

    1.6K10

    创建子类对象时,父构造函数调用被子类重写的方法为什么调用的是子类的方法

    A对象的时候父调用子类方法?...但是:创建B对象父调用方法? 答案: 当子类被加载到内存方法区后,会继续加载父到内存。...如果,子类重写了父方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父方法引用。 如果子类重载了父方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父方法,则方法引用会指向父方法。 当子类对象创建时,会先行调用的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译的时候,父构造方法调用方法的参数已经强制转换为符合父方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

    6.2K10

    方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用需要调用构造方法。 但 static的

    方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用需要调用构造方法。...但 static的方法直接用调用就行!...可以通过调用。     其实它本身也可以通过对象名调用。     推荐使用调用。     静态修饰的内容一般我们称其为:与相关的,成员。...B:内存位置不同     静态变量存储于方法区的静态区。     成员变量存储于堆内存。   C:内存出现时间不同     静态变量随着的加载而加载,随着的消失而消失。     ...static 被jvm调用,不用创建对象,直接名访问。     void 被jvm调用,不需要给jvm返回值。     main 是一个通用的名称,虽然不是关键字,但是被jvm识别。

    1.1K20

    Java继承的概念及方法

    为什么需要继承 接下来我们通过实例来说明这个需求。...java 若要在子类调用方法,需使用关键字super。 面向对象编程——继承和多态 1、为什么使用继承 已有的派生出新的,称为继承。...2、父和子类 如果类 B A 派生,或者说 B 扩展 A,或者说 B 继承 A, 则称 A 为”父”,也称为超、基; 称 B 为”子类”,也称为次扩展、派生。...静态方法不能使用 super 关键字调用方法语法: super.方法名(参数列表); 如果是继承的方法,是没有必要使用 super 来调用,直接即可调用。...但如果子类覆盖或重写了父方法,则只有使用 super 才能在子类调用的被重写的方法。 4、this 关键字 this 关键字表示当前对象。

    44920

    Kotlin 开发者角度看 Java 缺失的特性

    Kotlin 就没有给你这种选择:每个属性和局部变量都需要定义为 val 或 var。另外,不能重新给方法参数赋值。 Java 的 var 关键字完全不同。首先,它只能用于局部变量。...更重要的是,它没有提供与之对应的不可变的 val 关键字,你仍然需要添加 final 关键字,但几乎没有人使用它。 空安全 (Null Safety) 在 Java ,我们无法知道变量是否为空。...例如,你可以为你无法修改的第三方库或接口添加新函数。这些函数可以按照通常的方式进行调用,就好像它们就是原始方法一样。这种机制叫作扩展函数。 ...要声明扩展函数,需要用被扩展名作为前缀。...; Kotlin 的标准库已经有 capitalize() 函数; 调用扩展函数,就好像它属于 String 一样。

    78920

    【Java学习笔记之十六】浅谈Java的继承与多态

    表示父和子类的术语:父和子类、超和子类、基和派生,他们表示的是同一个意思。 2、  为什么需要继承?什么时候应该继承? 使用继承可以有效实现代码复用,避免重复代码的出现。...在Java语言中,用extends(扩展关键字来表示一个继承了另一个。 在父只定义一些通用的属性和方法。 子类自动继承父的属性和方法,子类可以定义特定的属性和方法。...5、  super关键字的用法和位置,super关键字调用的构造方法,super关键字调用方法? 在子类的构造方法,通过super关键字调用的构造方法。...如果子类重写了父方法,可以通过super关键字调用方法。...8、  为什么需要使用多态?多态的好处? 可以增强程序的可扩展性及可维护性,使代码更加简洁。 不但能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。 9、  如何实现多态?

    98170

    java8的default关键字

    有很多银弹,语法糖和套路可以完美解决代码的扩展性,优雅性。今天简单了解下java8的default关键字。...default关键字 default是在java8引入的关键字,也可称为Virtual extension methods——虚拟扩展方法。...是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现代码。 为什么要有这个特性?...首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的,目前的java8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK...实现Test实现了接口A又实现了接口B,两个接口中都定义可相同的默认方法。编译器此时已经被干懵了,当我们在Test调用方法时,它不知道该去调用A的默认方法还是去调用B的方法

    2.1K40

    Kotlin的扩展函数知识点

    为什么需要扩展 一个新特性的出现必然是为了解决之前遗留的开发问题和提升目前开发效率。扩展函数也是如此。 首先来介绍下OOP:开放封闭原则。 软件应该是可扩展,而不可修改的。...不定义在,也就是外部 可以看到上面反编译后的扩展函数就是这种类型,被static,public,final修饰的方法会有这个特征:在同一个包是可以共享这个扩展函数的也就是可以调用到这个扩展函数...(和正常的方法没什么区别了),也就是其他地方调用不到了,只有该类或者该类的子类可以调用;如果失去了public关键字,那么将只有该类才能使用这个扩展函数,其子类也无法使用。...函数优先级 有没有想过这样一种情况:就是这个扩展的函数名之前在这个中就已经存在了,那么调用这个方法时,会调用扩展函数还是之前定义好的方法。...扩展函数注意点 调用者类型是运行时类型,而接受者类型是编译时类型也就是说当扩展被生命为成员函数时具体调用哪个扩展方法是由它的运行时类型决定,而具体调用哪个扩展方法是根据其被定义为什么类型也就是编译时可知类型

    31030
    领券