首页 > 编程语言 >kotlin 与java 接口不兼容@FunctionalInterface

kotlin 与java 接口不兼容@FunctionalInterface

时间:2024-08-06 11:28:05浏览次数:11  
标签:runnable run name bilibli kotlin alibaba FunctionalInterface methodName java

需求:获取当前方法名
为了获取当前方法名已知的有1.堆栈获取2.通过classs 的enclosingMethod.name
比较准确的是enclosingMethod,但是为了获取这个还需要一个内部类,于是用到了Runable,但是run方法没有返回值
于是出现了神奇问题

1.照Runnable 抄一份:源码如下:
@FunctionalInterface public interface Runnable { public abstract void run(); }
2.自定义接口 kotlin 版本会自动给转换成为
fun interface IRunnable { fun run(): String? }

使用方法如下:
`class Internal() {

fun bilibli() {
    val runnable = IRunnable {

            val methodName = object : Any() {}.javaClass.enclosingMethod.name
            Log.d("测试", "bilibli当前方法名:${methodName}")
             methodName

    }
    val name = runnable.run()
    Log.d("测试", "bilibli当前方法名:${name}")

}

fun alibaba() {
    val runnable = Runnable {
        val methodName =
            object : Any() {}.javaClass.enclosingMethod.name
        Log.d("测试", "alibaba当前方法名:$methodName")
        return@Runnable
    }
    runnable.run()
}

`
问题来了:
回合1:结果
alibaba:打印出来了预期值alibaba
bilibli 打印返回竟然是:run

于是不服更改方式
尝试1:更改接口:
@FunctionalInterface interface IRunnable { fun run(): String? }
回合2:依旧是
alibaba:打印出来了预期值alibaba
bilibli 打印返回竟然依旧是:run
无解,查看字节码反编译文件如下:
` public final class Internal {
public final void bilibli() {
IRunnable runnable = com.example.demo.Internal::bilibli$lambda$1;
String name = runnable.run();
Log.d("测试", "bilibli当前方法名:" + name);
}

public final void alibaba() {
    Runnable runnable = com.example.demo.Internal::alibaba$lambda$2;
    runnable.run();
}

private static final String bilibli$lambda$1() {
    String methodName = (new Object() {
    }).getClass().getEnclosingMethod().getName();
    Log.d("测试", "bilibli当前方法名:" + methodName);
    return methodName;
}

private static final void alibaba$lambda$2() {
    String methodName = (new Object() {
    }).getClass().getEnclosingMethod().getName();
    Log.d("测试", "alibaba当前方法名:" + methodName);
}
'

汇合3:无奈,只能将IRunnable改成java
@FunctionalInterface public interface IRunnable { public abstract String run(); }

结果:
alibaba:打印出来了预期值alibaba
bilibli 打印返回竟然依旧是:bilibli
目前看达到预期:
此处有些疑惑不解,java@FunctionalInterface interface 和kotlin fun interface虽然有所同,但是kotlin用@FunctionalInterface interface也依旧无效,不知原因点在哪,字节码也是相同。肾是困惑

标签:runnable,run,name,bilibli,kotlin,alibaba,FunctionalInterface,methodName,java
From: https://www.cnblogs.com/lizhanqi/p/18344810

相关文章

  • javax.validation包校验嵌套属性(List对象)的写法
    1maven依赖<!--HibernateValidator用于数据验证--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></depende......
  • JavaScript 中的“this”几种不同含义
    在JavaScript中,“ this ”指的是当前正在执行代码的对象。其值由函数的调用方式动态确定,这意味着它可以根据上下文而变化。1.全球背景在全局上下文中(即任何函数或对象之外),“ this”指的是全局对象。在浏览器中,“ this”是窗口对象,而在Node.js中,它是全局对象。2.对象......
  • MyBatis 根据数据表反向生成 java 实体类等
    MyBatis根据数据表反向生成java实体类等  1、MyBatis根据已有的数据表生成对应的Java实体类的配置文件:mybatisReverseGeneratorConfig.xml此文件放到项目的根目录下 1<?xmlversion="1.0"encoding="UTF-8"?>2<!DOCTYPEgeneratorConfiguration......
  • 简单设计一个JAVA并行处理工具类
    在工作中,我们肯定遇到过一个接口要处理N多事项导致接口响应速度很慢的情况,通常我们会综合使用两种方式来提升接口响应速度优化查询SQL,提升查询效率开启多线程并发处理业务数据这里讨论第二种方案:使用多线程并发处理业务数据,最后处理完成以后,拼装起来返回给前端,每个人的实现方......
  • Java IO流 详细版
    一、什么是IO流IO:输入/输出(Input/Output)流:是一种抽象概念,是对数据传输的总称.也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的.常见的应用:文件复制;文件上传;文件下载二、IO流的分类按照数据的流向输入流:读数据输出......
  • 「Java开发指南」MyEclipse for Spring参数 - 注释器(一)
    MyEclipsev2024.1离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论1.Spring开发中的注释器注解器是MyEclipse中带有Spring支持的代码助手的一部分,它帮助开发人员进行基于注解的开发。虽然大多数Java开发人员都了解如何从技术上使用Java注释,但对于特定技术,哪些注释是......
  • java笔记5
    9.抽象类与接口抽象类抽象类的概念抽象类是面向对象编程中不能被实例化的一种类,它通常被用作基类,为其他类提供公共的接口或实现。什么是抽象抽象是将现实世界中的复杂事物简化为基本特征的过程,它关注对象的本质特征,忽略细节,只说明做什么,不说明怎么做。为什么要抽象抽象帮......
  • 2024,Java开发在中国市场还有发展前景吗?
    随着2024年的到来,Java作为一种经典而强大的编程语言,依然在中国的软件开发市场中扮演着重要角色。然而,许多人对Java的未来发展前景持有不同的看法。让我们来探讨一下当前情况和未来的走向。Java程序员真的过剩了吗?2023年,各大求职网站上的java职位数量相对于其他技术岗位来......
  • Java之类和对象
    目录static关键字1修饰属性2修饰方法 final构造方法基本语法this关键字代码块定义普通代码块 构造代码块静态代码块匿名对象toString 总结static关键字1修饰属性Java的静态属性和类相关,和具体的实例无关.换句话说,同一个类的不同实例共用同一个静......
  • Java调用Linux命令行SpringBoot
    原文链接:https://blog.csdn.net/u014628771/article/details/108308337需求在Linux服务器上的SpringBoot程序中,调用gitclone,之后遍历git仓库中的所有文件。遍历git仓库可以使用File类实现,现在的问题是需要在SpringBoot程序中调用gitclone命令。实现方式使用Javanative的Proc......