Collections 如何使Groovy阵列具有可比性?

Collections 如何使Groovy阵列具有可比性?,collections,groovy,metaclass,Collections,Groovy,Metaclass,像这样尝试: ArrayList.metaClass.compareTo = {arg -> this?.size() <=> arg?.size() } [1]<=>[2] ArrayList.metaClass.compareTo={arg->this?.size()arg?.size()} [1][2] 它不起作用 仍然存在异常:无法将java.util.ArrayList与值“[1]”和java.util.ArrayList与值“[2]”

像这样尝试:

   ArrayList.metaClass.compareTo = {arg -> this?.size() <=> arg?.size() }  
   [1]<=>[2]
ArrayList.metaClass.compareTo={arg->this?.size()arg?.size()}
[1][2]
它不起作用


仍然存在异常:无法将java.util.ArrayList与值“[1]”和java.util.ArrayList与值“[2]”进行比较。。。你为什么要这样做?
比较运算符都依赖于实现Comparable的类,而不仅仅是compareTo方法,我认为不可能在现有类上强制使用该接口。

好的,您将需要另一种方法

一种方法是实现
比较器
接口

另一种方法是根据需要使用
元类
,但是您将无法使用
操作符,因为
列表
没有实现
可比

List.metaClass.compareTo = { Collection other ->
    delegate.size() <=> other?.size()
}

def x = [1, 2, 3]
def y = [4, 5]

println x.compareTo(y)  // but x <=> y won't work
List.metaClass.compareTo={Collection other->
delegate.size()其他?.size()
}
def x=[1,2,3]
defy=[4,5]
println x.compareTo(y)//但是xy不起作用

您可以将列表标记为可比较:

List.metaClass.compareTo = { other ->
    delegate[0] <=> other[0]
}
assert ([1,2] as Comparable) <=> ([3,4] as Comparable) == -1
assert ([3,4] as Comparable) <=> ([1,2] as Comparable) == 1
assert ([3,4] as Comparable) <=> ([3] as Comparable) == 0
List.metaClass.compareTo={other->
委托[0]其他[0]
}
断言([1,2]可比)([3,4]可比)=-1
断言([3,4]可比)([1,2]可比)=1
断言([3,4]可比)([3]可比)=0