第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ClosureParams:如何在 groovy 中為閉包參數(shù)指定泛型類型

ClosureParams:如何在 groovy 中為閉包參數(shù)指定泛型類型

紫衣仙女 2023-03-02 15:42:07
我在 Java 中有以下方法:public void myMethod(        @ClosureParams(                value = SimpleType.class,                options = {                        "java.util.Map"                }        ) Closure<String> closure) {    ...}它必須@ClosureParams為 IDEA 中的靜態(tài)類型檢查器和類型推斷指定閉包的參數(shù)類型。在 Groovy 腳本中,我按如下方式調(diào)用此方法:myMethod { Map<String, Object> doc ->    ...}它工作正常。但是當(dāng)我嘗試在我的 java 方法中為閉包指定泛型類型時:java.util.Mappublic void myMethod(        @ClosureParams(                value = SimpleType.class,                options = {                        "java.util.Map<java.lang.String,java.lang.Object>" // <-- added here                }        ) Closure<String> closure) {    ...}groovy 的靜態(tài)類型檢查器失敗并出現(xiàn)錯誤:org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:C:\myproject\script.groovy: 1: Expected parameter of type java.util.Map<java.lang.String,java.lang.Object> but got java.util.Map <String, Object> @ line 1, column 8.myMethod { Map<String, Object> doc ->doc盡管 IDEA在沒有任何提示Map或Map<...>使用提示的情況下推斷出類型@ClosureParams。當(dāng)我查看groovy.transform.stc.SimpleType類的源代碼時,我發(fā)現(xiàn)這個類沒有提供指定泛型類型的能力,因?yàn)樗褂?plain Class.forName:public class SimpleType extends SingleSignatureClosureHint {    @Override    public ClassNode[] getParameterTypes(final MethodNode node, final String[] options, final SourceUnit sourceUnit, final CompilationUnit unit, final ASTNode usage) {        ClassNode[] result = new ClassNode[options.length];        for (int i = 0; i < result.length; i++) {            result[i] = findClassNode(sourceUnit, unit, options[i]);        }        return result;    } }我的問題:如何在 groovy 中使用泛型指定閉包參數(shù)類型?最好有 IDEA 的支持。
查看完整描述

1 回答

?
哈士奇WWW

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個贊

您可以使用groovy.transform.stc.FromString簽名提示來使泛型類型正常工作。考慮以下示例:


Java類.java


import groovy.lang.Closure;

import groovy.transform.stc.ClosureParams;

import groovy.transform.stc.FromString;


import java.util.HashMap;


public class JavaClass {


    public static void processRendered(@ClosureParams(

            value = FromString.class,

            options = {"java.util.Map<java.lang.String,java.lang.Object>"}) Closure closure) {


        closure.call(new HashMap<String, Object>());

    }

}

腳本.groovy


import groovy.transform.CompileStatic

import static JavaClass.processRendered


@CompileStatic

def test() {

  processRendered { Map<String, Object> map ->

    map.put("test", 1)

  }


  processRendered {

    it.put("test", 2)

  }

}


test()

它編譯并為您提供簽名提示,也適用于隱式it變量。

http://img1.sycdn.imooc.com//640053e3000115a505830434.jpg

以下示例使用 Groovy 2.5.7



查看完整回答
反對 回復(fù) 2023-03-02
  • 1 回答
  • 0 關(guān)注
  • 252 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號