【问题标题】:What's the difference between T and def in groovy?groovy中的T和def有什么区别?
【发布时间】:2017-05-15 02:45:32
【问题描述】:

我之前正在使用一些 SQL,这让我想知道这两种类型之间有什么区别。

在我的示例中,我有 2 个 GroovyRowResults - pastData 和 currentData。现在,我需要比较这些结果集中的 2 个点。这些值都应该是不定类型。那么,在定义它们时,

def pastResult = pastData[commonKey]
def currentResult = currentData[commonKey]

if(pastResult == currentResult){
    doSomething()
}

T pastResult = pastData[commonKey]
T currentResult = currentData[commonKey]

if(pastResult == currentResult){
    doSomething()
}

【问题讨论】:

    标签: groovy


    【解决方案1】:

    我假设 T 已在您的方法/类中声明过。在这种情况下,它是generic,而T 始终指代同一类型的对象,而def 基本上只是Object 的别名。

    T 不保证这两个对象是完全相同的类(它们可能只是实现相同的接口,或者一个可能是子类),它确实在您正在处理的对象中创建了更多的契约。如果将相同类型的对象传递给方法,则不会有区别,但如果传递不同或意外的类型,则更有用。

    换句话说,在 Groovy 中这样做是为了可读性和一致性,并且使用泛型比使用动态类型要好得多。

    【讨论】:

    • 谢谢伊戈尔!我觉得在我潜伏的很长一段时间里,我在一群人身边见过你。我知道 groovy 是一种动态语言 - 所以我不必在使用 def 创建它之后强制转换。这是否使 Object 和 T 之间的差异比 def 和 T 的差异略小?
    • @Zyxer22 是的,没问题。至于差异...我认为只要您在初始化对象后不更改类型就不会有太多差异。 def 在您从列表转换为数组再到链表等时会派上用场(而 Object 不允许您这样做)。但是出于您的目的,我认为 defObject(实际上,甚至 T)是相同的。
    【解决方案2】:

    我不认为第二个例子会起作用,除非有某种叫做 T 的对象。检查这个链接 http://groovy-lang.org/semantics.html#_variable_definition

    【讨论】:

    • Groovy 使用 java 库,所以它应该可以工作,但我测试了它只是为了确定。导入 java.lang.invoke.MethodHandleImpl.BindCaller.T public foo(){ T bar = 5 T bar2 = 4 bar == bar2 }
    • 评论格式不起作用,显然我无法编辑。我刚刚导入了 bindcaller.T java 库并创建了一个使用上述值的公共 void foo() 函数。
    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多