簡體   English   中英

Java(或Groovy)相當於Scala的應用

[英]Java (or Groovy) equivalent of Scala's apply

在Scala中,如果有一個對象Foo已經apply(x: Int)我可以用Foo(42)調用它(作為Foo.apply(42)簡寫)。

是否可以在Java或Groovy中復制它? 我原以為Groovy的call函數可能類似但是def call(int x)static def call(int x)導致調用call

編輯 :根據請求添加示例DSL

典型/現有DSL: alter 't' add 'a' storing BAR (其中BAR是枚舉)。 試圖在上面添加一些代替BAR東西,但是會接受一個參數,但是語法沒有太大差別,理想情況下: alter 't' add 'a' storing FOO(42)

我已經創建了FOO作為一個帶有接受int的構造函數的類 - 我現在正在尋找的是一種通過FOO(42)而不是new FOO(42)FOO.call(42)調用該構造函數的方法

Groovy中直接的方法是在類上編寫static call()方法,但它不會使Clazz()工作。 這可能是一個錯誤,但我找不到關於它的JIRA。

我想建議使用閉包:

import groovy.transform.Canonical as C

@C class Bar { def bar }

@C class Baz { def baz }

A = { new Bar(bar: it) }

B = { new Baz(baz: it) }


assert A("wot") == new Bar(bar: "wot")
assert B("fuzz") == new Baz(baz: "fuzz")

更新 :似乎類名被解析為被調用者上下文中的靜態方法調用,這可行(但它不能在DSL中使用):

class A { 
    static call(str) { str.toUpperCase() } 
}
assert ((Class)A)("qwop") == "QWOP"

更新2:根據您的DSL示例,刪除parens是否可行?

class FOO {}


def params = [:]

alter = { 
  params.alter = it
  [add : { 
      params.add = it
      [storing: { 
          params.clazz = it
          [:].withDefault { params.param = it }
      }]
  }]
}


alter 't' add 'a' storing FOO 42


assert params == [
  alter : 't',
  add   : 'a',
  clazz : FOO,
  param : '42'
]

Groovy中的Closure具有可以省略的方法call()

def action = { a, b = 1 -> println "$a and $b" }
action.call 1 // prints "1 and 1"
action( 1, 3 ) // prints "1 and 3"

在Java中,最接近的替代方案是Runnable :它提供no-arg run()但不能簡單

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM