2015-10-29 8 views
6

午前すべて - 同じような質問が2,3回尋ねられていますが、コンパイルされたプロジェクトやGradleを含むプロジェクトのようです。とにかく、私はエラーGroovyあいまいなメソッドのオーバーロード

Caused by: javax.script.ScriptException: groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method java.math.BigDecimal#<init>. 
Cannot resolve which method to invoke for [null] due to overlapping prototypes between: 
[class [C] 
[class java.lang.String] 

私はこの小さなスクリプトを実行して取得しています自体は、これが

import groovyx.net.http.HTTPBuilder 
import groovyx.net.http.RESTClient 
import groovy.json.JsonBuilder 
import groovy.json.JsonOutput 
import static groovyx.net.http.Method.GET 
import static groovyx.net.http.ContentType.JSON 

public class CrossCurrencyClient { 

    def issuingAddress = "rBycsjqxD8RVZP5zrrndiVtJwht7Z457A8" 
    String source = "rUR5QVHqFxRa8TSQawc1M6jKj7BvKzbHek" 
    String multiplier = "" 
    def resURL = "http://url-string.com/v1/" 
    def resourceIdClient = new RESTClient("${resURL}") 

    public String generateUUID() { 
     def resourceId = resourceIdClient.get(path:"uuid").data.uuid 
     println "resourceId = " + resourceId 
     return resourceId 
     } 

    public String crossCurrency(String amt,String currency,String targetCurrency) { 

     def http = new HTTPBuilder("${resURL}accounts/${source}/payments/paths/${source}/${amt}+${targetCurrency}+${issuingAddress}?source_currencies=${currency}+${issuingAddress}" 
) 

     http.request(GET,JSON) { 

      response.success = { resp, json -> 
       if(json.success){ 
        multiplier = json?.source_amount?.value 
       } 
      } 

      response.failure = { resp -> 
       println "Request failed with status ${resp.status} and message : ${resp.message}" 
       return "Something went wrong" 
      } 
     } 
    return multiplier  
    } 
} 

CrossCurrencyClient crossCurrencyClient = new CrossCurrencyClient() 

私は問題がここにあるものをうまくすることはできませんトリガ

String amt = "1" 
String currency = "GBP" 
String targetCurrency = "USD" 

def settlement = crossCurrencyClient.crossCurrency(amt, currency, targetCurrency) 

return transfer.amount * new java.math.BigDecimal (settlement) 

。私が見る限り、すべての方法が適切に行われ、あいまいさはありません。誰かが私が間違っている場所を指摘できますか?

+0

BigDecimalにはいくつかのコンストラクタがあるので、私はそれを解決できないと考えています。したがって、エラー –

答えて

6

あいまいなメソッド呼び出しは、BigDecimalをのコンストラクタです:

Ambiguous method overloading for method java.math.BigDecimal#<init> 

さらに、1つの可能なオーバーロードがBigDecimal(String val)コンストラクタであると言います。私は正確に[class [C]が何を参照しているのかわかりませんが、それはBigDecimal(BigInteger val)を参照していると思います。

それを引き起こしている行は、おそらくこのいずれかになります決済変数がnullであるため、

new java.math.BigDecimal (settlement) 

。同様の状況では、パラメータをキャストするだけでいいです:

new java.math.BigDecimal (settlement as String) 

しかし、おそらく後でNullPointerExceptionがスローされます。だから、BigDecimalのコンストラクタにnullを渡さないようにしてください。

+0

ありがとうございます。あなたが正しく示唆しているように、それはNullPointerExceptionをスローしていますが、それは整理するのは簡単です。 – Horsebrass

0

例外として、settlementnullです。したがって、GroovyはBigIntegerのどちらのコンストラクタがnullであるかを知りません。

それが原因でnullである:

jsonまたは source_amountがnullの場合はnullを返すので、そう、そして multiplierは、nullである
  if(json.success){ 
       multiplier = json?.source_amount?.value 
      } 

...

あなたのメソッドがnullを返す停止することができます。 ...それともにコンストラクタを変更します。

return transfer.amount * new BigDecimal((String)settlement) 
関連する問題