Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于kotlin中的比较器_Kotlin_Equals - Fatal编程技术网

关于kotlin中的比较器

关于kotlin中的比较器,kotlin,equals,Kotlin,Equals,这两者有什么不同 fun main(args: Array<String>) { var a = printName("Jennie") var b = printName("Jennie") println(a == b) // compiler : false var c = "Robert" var d = "Robert" println

这两者有什么不同


fun main(args: Array<String>) {
    var a = printName("Jennie")
    var b = printName("Jennie")
    println(a == b)     // compiler : false

    var c = "Robert"
    var d = "Robert"
    println(c == d)     // compiler : true
}

class printName(val name : String)


趣味主线(args:Array){
var a=打印名(“珍妮”)
var b=打印名(“珍妮”)
println(a==b)//编译器:false
var c=“罗伯特”
var d=“罗伯特”
println(c==d)//编译器:true
}
类printName(val名称:String)

使用该类时,即使字符串类型相同,结果也是
false
。但是如果我不使用class,那么发生的事情就是
true

如果你想使用
class
,你必须重写
equals
hashcode
。但是,如果要比较对象,如
等于
hashcode
已在
数据类中处理,也可以使用
数据类
c
d
是对同一
字符串
实例的引用(编译器看到两个字符串文本是相同的,并将它们合并。)但即使它们是不同的
string
实例,它们仍然会作为相等的实例进行比较。这是因为调用该方法,并且
string
重写该方法,以便在两个字符串具有相同字符时返回true

在第一种情况下,
a
b
是对不同的
printName
*实例的引用。(
printName()
是对其构造函数的调用,因此每次调用都返回一个新实例。)并且
printName
类不重写,因此它从其超类继承默认实现(
Any
)。对于不同的实例,该实现总是返回false,而不管它们的内容是否相同

如果希望不同的
printName
实例在内容相同的情况下进行相等比较,则应重写其
equals()
方法。您可以手动执行此操作,例如:

class PrintName(val name: String) {
    override fun equals(other: Any?) = other is PrintName
                                    && name == other.name
}
或者您可以将其设为一个,它会自动执行此操作。(它还添加了
toString()
和其他一些有用的方法,但在构造函数和继承方面有一些限制。)

另一种选择可能是共享或缓存
printName
s,而不是每次创建一个新的



(*顺便说一句,通常使用以大写字母开头的类名,因此它们非常突出。)

您的类不会覆盖
equals
,而字符串会覆盖。