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

使用构造函数args列表调用Java new而不是args本身(在Clojure中)

在Clojure中,使用构造函数args列表调用Java new而不是args本身是为了避免将args作为一个参数传递给Java构造函数。在Clojure中,args是一个特殊的符号,用于表示函数参数列表。当我们使用Java interop调用Java构造函数时,如果直接传递args作为参数,Clojure会将args作为一个参数传递给Java构造函数,而不是将args列表中的每个元素作为独立的参数传递。

为了正确地调用Java构造函数,我们需要使用apply函数将args列表中的元素展开为独立的参数。apply函数接受一个函数和一个参数列表,并将参数列表中的元素作为独立的参数传递给函数。

下面是一个示例,展示了如何使用构造函数args列表调用Java new而不是args本身:

代码语言:clojure
复制
(import 'java.util.ArrayList)

(defn create-arraylist [args]
  (let [arraylist (apply ArrayList. args)]
    arraylist))

(def my-arraylist (create-arraylist [1 2 3]))

在上面的示例中,我们定义了一个函数create-arraylist,它接受一个参数args。在函数内部,我们使用apply函数将args列表中的元素展开为独立的参数,并将它们传递给ArrayList的构造函数。最后,我们返回创建的ArrayList实例。

这样,我们就可以使用构造函数args列表调用Java new而不是args本身,确保正确地传递参数给Java构造函数。

推荐的腾讯云相关产品和产品介绍链接地址:

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

相关·内容

Clojure 运行原理之编译器剖析

但是 ClojureJava 不一样的地方在于,Clojure 可以在运行时进行编译然后加载, Java 明确区分编译期与运行期。...Compiler.java Compiler 类主要有三个入口函数: compile,当调用clojure.core/compile时使用 load,当调用clojure.core/require、clojure.core.../use时使用 eval,当调用clojure.core/eval时使用 这三个入口函数都会依次调用 macroexpand、analyze 方法,生成Expr对象,compile 函数还会额外调用...对应一个类,namespace 里面的每个函数对应类里面的方法,实际上并不是这样的,根据 Clojure 官方文档,对应关系是这样的: 每个文件、函数、gen-class 都会生成一个.class文件...(); i++) // 这里递归的求列表每项的值 ret = (IPersistentVector) ret.cons(((Expr) args.nth(i)).eval

99930
  • 几分钟内学习 Clojure

    Clojure源码托管:github 在线练习编译环境: himera learnclojure.clj 示例: ; 分号作为注释的开始 ; Clojure 用一种把元素用括号括起来的像列表一样的方式来书写...,元素之间用空格隔开 ; clojure 解释器会把第一个元素当做是函数或者宏调用,其他的都作为参数 ; 下面这个函数用于设置当前的命名空间 (ns test) ; 更多基本的例子: ; str 函数会用它所有的参数创造一个字符串...使用java对象类型来表示 布尔值、字符串和数字 ; 使用 `class`函数来检测它们....; 从一个map检索一个值,可以直接把这个map当做函数调用(这个NB) (stringmap "a") ; => 1 (keymap :a) ; => 1 ; 关键字也可以当做函数调用,从一个...[intersection]]) ; 使用reqire来导入一个模块 (require 'clojure.string) ; 使用/从一个模块调用函数 (clojure.string/blank

    1.7K40

    漫谈并发编程:Future模型(JavaClojure、Scala多语言角度分析)

    因为FutureData的notifyAll和wait函数,主程序会等待组装完成后再会继续主进程,也就是如果没有组装完成,main函数会一直等待。 这里只做一个简单的介绍,代码中会详细解释。...注意: 客户端调用的方法,单独启用一个线程来完成真实数据的组织,这对调用客户端的main函数式封闭的; 。...注意: 这里会先返回一个代理的Future数据,但是Client调用getResult()的时候,就会等待,直到真实的数据构造完成。...虽然阻塞方式不是一个很好的用法,但是可以说明问题。 这个例子,通过未来某个时间计算1+1,当计算结果后再返回。...Clojure语法层面上直接支持future,使用future关键字即可。 使用deref或者@可以对future对象进行解引用。

    1.8K30

    Java类的初始化和清理

    C++ ,无参构造器被称为默认构造器,这个术语 Java 出现之前使用了很多年。...必须使用 this 才能将自身传递给外部方法。 构造调用构造器 当你一个类写了多个构造器,有时你想在一个构造调用另一个构造器来避免代码重复。你通过 this 关键字实现这样的调用。...通常当你说 this,意味着"这个对象"或"当前对象",它本身生成对当前对象的引用。一个构造,当你给 this 一个参数列表时,它是另一层意思。...Java 代码,也许会调用 C 的 malloc() 函数系列来分配存储空间,而且除非调用 free() 函数,不然存储空间永远得不到释放,造成内存泄露。...如果对象是用 new 创建的(类似于 Java ),那么当程序员调用 C++ 的 delete 操作符时(Java 不存在),就会调用相应的析构函数

    91220

    Java基础系列5:Java代码的执行顺序

    关于构造方法,需要注意: 如何调用构造方法实例化的时候调用,如上述代码的Person p1=new Person(),这里便调用了Person类的无参构造构造方法由系统自动调用 构造函数重载...不是滴,当你没有显示声明构造函数时,程序会自动生成一个默认的无参构造函数 并且该构造函数的权限是随着类的改变改变的(类为public,构造函数也为public;类改为private,构造函数也改为private...);当该类一旦声明了构造函数以后,java 是不会再给该类分配默认的构造函数。...具体说静态代码块由类调用,类调用时先执行静态代码块,然后才执行主函数。 静态代码块是给类初始化的,构造代码块是给对象初始化的。 静态代码块的变量是局部变量,和普通方法的局部变量没有区别。...(4)类SubClass存在父类,则调用父类的构造函数,你可以使用super来指定调用哪个构造函数。基类的构造过程以及构造顺序,同派生类的相同。

    76430

    Java编程思想第五版 第六章-初始化和清理

    C++ ,无参构造器被称为默认构造器,这个术语 Java 出现之前使用了很多年。...所以,你不能有一个 print() 函数既能打印整型,也能打印浮点型——每个函数名都必须不同。 Java (C++) ,还有一个因素也促使了必须使用方法重载:构造器。...必须使用 this 才能将自身传递给外部方法。 构造调用构造器 当你一个类写了多个构造器,有时你想在一个构造调用另一个构造器来避免代码重复。你通过 this 关键字实现这样的调用。...通常当你说 this,意味着"这个对象"或"当前对象",它本身生成对当前对象的引用。一个构造,当你给 this 一个参数列表时,它是另一层意思。...如果对象是用 new 创建的(类似于 Java ),那么当程序员调用 C++ 的 delete 操作符时(Java 不存在),就会调用相应的析构函数

    69441

    前端入门12-JavaScript语法之函数声明正文-函数

    JavaScript ,所有的函数,只要它和 new 关键字一起使用的,此时,就可称这个函数构造函数。...函数调用Java 不一样的地方, JavaScript 函数也是对象,既然是对象,那么对于函数对象这个变量是可以随意使用的,比如作为赋值语句的右值,作为参数等。...所以,对于函数的不同场景的调用,重要的区别就是上下文。 作为构造函数调用 普通函数挂载在对象,通过对象来调用称方法;当普通函数结合 new 关键字一起使用时,被称为构造函数。...var o = { f:function () { return []; } } var b = new o.f(); //b是[] 空数组对象,不是f 间接调用... arguments 对象还有一个属性 callee,它指向当前正在执行的函数函数体内部可以通过 arguments.callee 来获取函数对象本身,然后访问它的 length 属性。

    55120

    ThinkingInJava对this关键字的介绍

    而且它本身会产生当前对象的一个句 柄。一个构建器,若为其赋予一个自变量列表,那么 this 关键字会具有不同的含义:它会对与那个自变 量列表相符的构建器进行明确的调用。...个人总结: this关键字必须写在构造方法内部 构造函数,如果你不指定构造器之间的调用关系,那么编译器会给你加上super();目的是初始化当前对象时,先保证了父类对象先初始化。...所以,你指定了构造函数间的调用,那么this()必须在第一行,以保证执行任何动作前,对象已经完成了初始化。 构造函数只能被构造函数调用,因为对象只会初始化一次。...构造方法内部,只能调用一个构造方法 类似this()和super()这样的方法被称为构造方法,顾名思义,他的作用就是JVM堆构建出一个指定类型的对象,如果你调用了两个这种形式的方法,岂不是代表着构建出了两个对象...非构造方法不能在方法内部调用构造方法 普通的成员方法,如果调用super()或者this(),你是想要重新创建一个对象吗?抱歉Java为了保证自身对象的合理性,不允许你做这样的操作。

    41030

    Java安全-反射篇

    上面例子执行顺序为: 类初始化:static{} 类实例化:static{} -> {} -> 构造函数 所以,forName的initialize其实是决定是否执⾏类初始化,不是类实例化 简单利用...Class.newInstance(),Java反射框架类对象创建新的实例化对象的方法。作用就是调用这个类的无参构造函数。...当调用newInstance不成功时,原因可能是: 使用的类没有无参构造函数 使用的类构造函数是私有的 私有的类构造方法 最常见的情况就是java.lang.Runtime,这个类构造命令执行Payload...此时可以将数据库链接所使用的类的构造函数设为私有,这样只有类初始化时才会执行一次构造函数,然后通过编写一个静态方法来获取这个数据库对象。...Class.getConstructor(),作用是获取构造函数对象,接收的参数是构造函数的参数类型列表

    67520

    Clojure 学习入门(18)—— 数据类型

    Clojure本身只有少量不同的类型,而且Clojure不是面向对象语言,它本身并不支创建新的用户自定义类型。一般来说,这让事情非常简单。...they learn a new language" 字符串输入反斜杠字符,只需输入两个反斜杠。...列表Clojure来说列表十分重要,因为实际上Clojure程序本身就是由很多嵌套着的组成的。最基本的层面上来讲,一个列表就是一些元素的有序集合。...列表可以通过使用括号来直接输入,这也是为什么Clojure代码本身使用了如此多的列表。例如,正常地调用一个函数:(println "Hello World!")...如果只是作为数据结构不是可执行代码来使用列表,只需要给列表加一个单引号作为前缀即可。这告诉Clojure将其作为数据结构来对待,不是将其当作Clojure形式对其求值。

    2.3K10

    Java初始化对象的工具 - 构造

    隐式构造刚刚开始学习面向对象部分时,可能都会存在一个疑问,之前定义的class都没有定义构造器呀,不是一样可以通过new来创建实例吗?...所以这就能够解释,为什么明明我们.java文件没有定义构造器,但是创建对象时却可以使用new调用到。...那么,大家应该也注意到了一个问题,既然用new创建对象时是调用构造器,那么现在我们自己定义了一个有参数的构造器,那么就会使得我们最常使用new Person()这种实例化的代码报错,因为此时类已经没有无参构造器可供调用了...而且由于构造本身的主要作用是用于为类的属性赋初始值,所以构造我们会指定一些参数,用于被调用时传入,为当前类的属性赋值。...我们进行变量命名时,一直强调见名知意,那么问题就来了:定义的成员变量名称已经确定了,构造传入的参数就是为了给这些属性赋值的,那么参数的名称是不是应该和类成员变量一样才更能表达意思呢?

    92931

    函数式编程:Lambda 表达式

    允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。... 函数式编程语言当中,函数被当做一等公民对待。函数作为一等公民的编程语言中,Lambda 表达式的类型是函数。但是Java8 ,有所不同。... Java8 ,Lambda 表达式是对象,不是函数,它们必须依附于一类特别的对象类型 —— 函数式接口 。 简单的说, Java8 ,Lambda 表达式就是一个函数式接口的实例。...注意: 该接口中重写的抽象方法,仅仅只是调用了其他类构造器 (new 对象)就没有其它的逻辑语句了,只有一条语句才可以使用 构造器引用。...注意: 该接口中重写的抽象方法,仅仅只是调用了其他类构造器 (new 对象)就没有其它的逻辑语句了,只有一条语句才可以使用 构造器引用。

    67630

    Java创建对象的5种方式,你都知道几种?【享学Java

    那么使用new关键字创建对象都离我们渐行渐远的今天,你是否知道Java创建对象有哪些种方式呢?...5、反序列化 当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,反序列化时,JVM创建对象并不会调用任何构造函数。...据我测试单单一个如上的Person对象的反序列化,2M的JVM内存都还不够… 5种方式对是否调用构造器的总结 这其实又可以衍生出一个面试题:Java创建实例对象是不是必须要通过构造函数?...Class类位于java的lang包Constructor是java反射机制的一部分 Class类的newInstance只能触发无参数的构造方法创建对象,构造器类的newInstance能触发有参数或者任意参数的构造方法来创建对象...Class类的newInstance需要其构造方法是public的或者对调用方法可见的,构造器类的newInstance可以特定环境下调用私有构造方法来创建对象。

    23.2K63

    Java面向对象OOP

    创建人类的对象时,直接指定这个对象的年龄和姓名,一次完成 构造器的主要目的:完成对新对象的初始化,不是创建新对象 基本语法 [修饰符] 方法名(形参列表){ 方法体 } 构造器的修饰符是可以默认的...[] args) { // 当new一个对象时,直接通过构造器指定名字和年龄 // new的时候直接传参,可以使用构造器 Person p1 = new...:父类和子类的构造调用问题 子类必须调用父类的构造器,完成父类的初始化 也就是说,main函数实例化子类时,是首先进行父类的构造调用,然后再进行子类的构造调用(初始化) 第三:父类没有默认的无参构造器时...调用父类的**无参构造器**,super()的参数什么都不写,默认调用super() #### 第五:super的使用 1. super使用时,**必须放在构造器的第一行** 2....args取下标,来获取到main函数的参数的具体的值 实际是将main函数的参数打包成一个字符串,然后传给main函数 java 执行的程序 参数1 参数2 参数3 main的特别说明 main

    17710

    一个对象的前世今生

    Java代码,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象,这种方式Java规范中被称为 : 由执行类实例创建表达式引起的对象创建。...Java要求构造函数的第一条语句必须是超类构造函数调用语句),构造函数本身的代码之前。...在编译生成的字节码,这些构造函数会被命名成()方法,参数列表Java语言书写的构造函数的参数列表相同。 ?...事实上,这一点是构造函数中保证的:Java强制要求Object对象(Object是Java的顶层对象,没有超类)之外的所有对象构造函数的第一条语句必须是超类构造函数调用语句或者是类定义的其他的构造函数...通过使用Bar类的构造方法new一个Bar类的实例时,首先会调用Foo类构造函数,因此(1)处输出是2,这从Foo类构造函数的等价变换可以直接看出。(2)处输出是0,为什么呢?

    48410

    深入理解Java对象的创建过程:类的初始化与实例化

    Java代码,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象,这种方式Java规范中被称为 : 由执行类实例创建表达式引起的对象创建。...Java要求构造函数的第一条语句必须是超类构造函数调用语句),构造函数本身的代码之前。...在编译生成的字节码,这些构造函数会被命名成()方法,参数列表Java语言书写的构造函数的参数列表相同。...事实上,这一点是构造函数中保证的:Java强制要求Object对象(Object是Java的顶层对象,没有超类)之外的所有对象构造函数的第一条语句必须是超类构造函数调用语句或者是类定义的其他的构造函数...通过使用Bar类的构造方法new一个Bar类的实例时,首先会调用Foo类构造函数,因此(1)处输出是2,这从Foo类构造函数的等价变换可以直接看出。(2)处输出是0,为什么呢?

    3K51

    Java反射机制的原理及Android下的简单应用

    走过路过不要错过 点击蓝字关注我们 一、反射的概念及Java的类反射 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。计算机科学领域,反射是一类应用,它们能够自描述和自控制。...平时的使用,要注意对这几种方法的灵活运用,尤其是对Class.forName()方法的使用。因为很多开发,会直接通过类的名称取得Class类的对象。...,具有多态的性质,那么我们可以通过构造方法的参数列表的不同,来调用不同的构造方法去创建类的实例。...Method类中有一个public成员函数:Object invoke(Object receiver, Object... args),参数receiver指明了调用对象,参数args指明了该方法所需要接收的参数...如果我们调用的方法所需要的参数不是简单类型的变量,而是自定义的类对象,或者List列表,再如果我们只知道类名和方法名,不知道方法的参数类型,那我们该如何处理这些情况呢?

    95810
    领券