• 哒哒LoveYou
    2019-05-12
    Lambda参数限制在Kotlin1.3之后没有限制了吧!
    ```java
    /*
     * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
     * that can be found in the license/LICENSE.txt file.
     */

    package kotlin.jvm.functions

    import kotlin.jvm.internal.FunctionBase

    /**
     * A function that takes N >= 23 arguments.
     *
     * This interface must only be used in Java sources to reference a Kotlin function type with more than 22 arguments.
     */
    @SinceKotlin("1.3")
    interface FunctionN<out R> : Function<R>, FunctionBase<R> {
        /**
         * Invokes the function with the specified arguments.
         *
         * Must **throw exception** if the length of passed [args] is not equal to the parameter count returned by [arity].
         *
         * @param args arguments to the function
         */
        operator fun invoke(vararg args: Any?): R

        /**
         * Returns the number of arguments that must be passed to this function.
         */
        override val arity: Int
    }
    ```
    展开

    作者回复: 嗯,是的,新版本没这个限制了。
    毕竟视频录的时候还是1.1时候

    
     3
  • 天空
    2018-10-06
    为什么我现在用Java定义后运行
    仍旧报java.lang.NoClassDefFoundError: kotlin/jvm/functions/FunctionN
    我定义的
    package kotlin.jvm.functions;
    import kotlin.Function;
    public interface Function23<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, P21, P22, P23, R> extends Function<R> {
         R invoke(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10, P11 p11, P12 p12, P13 p13, P14 p14, P15 p15, P16 p16, P17 p17, P18 p18, P19 p19, P20 p20, P21 p21, P22 p22, P23 p23);
    }
    展开

    作者回复: 你的代码应该没问题,可以在github参考一下视频中的代码工程,看看是不是包名或者工程有问题。

    
     1
  • 仗剑江湖
    2019-02-20
    kotlin类中使用main方法报ClassNotFoundException,怎么搞

    作者回复: 贴一下代码看看

    
    
  • 小美
    2018-12-15
    var ruunableOrigin = {
            name:String ->
            println("name")
            return name
            
        }

    张涛老师,方便请教下 闭包为什么不能有返回值? 如果要有返回值可以吗?
    展开

    作者回复: 闭包不能显示使用return,但是闭包的最后一条语句的结果就是闭包的返回值,视频里面有讲的。
    因为闭包在编译以后会变成Function接口对象,这个对象的方法已经固定了返回类型,所以不能再用return。

    
    
  • 书生依旧
    2018-11-12
    天空同学的问题是以为代码写在了 kotlin.jvm.functions 这个包下面,改成 kotlin 下面就好了。
    至于原因,看那个异常提示是 ClassNotFoundException: kotlin.Function23
    注意这个包名是 kotlin,但是 Functions.kt 这个类确实是在 kotlin.jvm.functions 包下。
    为什么编译后的 Class 文件会跑到 kotlin 下面?是不是因为 Functions 里面的接口都声明为了 public 类型?


    还有一个问题,把 lambda 编译成的 Java 代码看了一下,完全不知道看不出来 invoke 是怎么编译的。
    展开
    
    
  • 涛
    2018-09-22
    刘建同学的问题,可以这么解释:
    public static void show(JavaInterface javaInterface)的入参是个JavaInterface 接口实现类的实例对象
    fun show(javaInterface: JavaInterface)也是如此,所以,这个fun show()可以接收一个JavaInterface类型的实例。但是lambda被翻译成java后对应的接口类型叫FunctionN 在Java里和JavaInterface 当然是不同的接口,所以不能传。
    😀

    作者回复: 是的,没错

    
    
  • 刘建
    2018-08-13
    你好,可能我没有表达的很清楚,是这样的
    public static void show(JavaInterface javaInterface) {
             javaInterface.addddd("sss");
    }

    fun show(javaInterface: JavaInterface) {
             javaInterface.addddd("sss");
    }

    fun main(args: Array<String>) {
        val a = { s: String ->
            println(s)
        }
        JavaMain.show(a)
        show(a) //没办法传入
    }

    就是上次两个方法,一个Java方法一个Kotlin方法,参数都为同一个接口。但是Kotlin方法没法传lambda表达式,不知道是什么原因
    展开

    作者回复: 当然不行,你还得声明fun show(block: (str: String)-> Unit){
    }这样的方法

    
    
  • 刘建
    2018-08-12
    还有个问题想要咨询一下,lambda表达式和Function是不是两种不同的类型,Kotlin在编译的时候会将lambda表达式编译成匿名的Function内部对象吗,那么lambda这种类型是否支持继承

    作者回复: 是不同类型,不支持继承的,没有继承lambda的语法

    
    
  • 刘建
    2018-08-12
    接口继承了Function,传入Lambda表达式还是不行,请问有没有其他的方式

    作者回复: function实际上与lambda是两种类型,只是编译后会被映射成同一个类型,你要声明lambda类型应该是()->Unit这种

    
    
  • 刘建
    2018-08-12
    是不是因为Java中lambda表达式就是一个语法糖,而在Kotlin中是一种类型,一个类型不能赋值给另外一个定义方法中参数的类型。那么lambda这种类型怎么样继承,应该可以通过继承来解决这个问题

    作者回复: lambda可以赋值给方法参数,但是不能继承

     1
    
  • 刘建
    2018-08-12
    你好,有个问题想咨询下,我在Kotlin中调用Java中的一个参数为一个interface的方法,可以传一个lambda表达式。但是调用Kotlin中参数同样为同一个interface的方法的时候为啥没法传lambda。期待你的回复,困惑了我很长时间

    作者回复: 其实你在kotlin中调java的interface也是不能直接传lambda的,你看到的像setonclicklistener这样的方法之所以能够直接传lambda,是因为kotlin单独做了重载,提供了一个可以传lambda的扩展函数

    
    
  • 小羊
    2018-07-18
    就是和java一样必须lamada表达式必须寄宿在一个函数式接口身上。kt预先定义了22个函数式接口。如果需要更多。就自定义函数式接口。
    这部分 知道 java 的lamada表达式 以及jdk准备的一堆函数式接口 应该就可以更好理解。
    jdk8 准备了泛型 返回参数0-1 x 入参 0-2 个函数式接口。以及一堆封装类的接口

    kt的入参 回参 看不懂。但是个数就简单粗暴的直接上到22。足足是jdk的 11(22/2)倍。笑XD

    作者回复: 👍

    
    
我们在线,来聊聊吧