如何在名称冲突中配置扩展方法的前置?

时间:2017-08-21 13:11:17

标签: extension-methods xtend

我想创建一个名为“map”的扩展方法来制作单个对象的内联映射。例如,如果您有一些json数据结构:

<tr <?php if($result['dress_quantity'] < 10){ echo "bgcolor='#FF0000';} ?>

不幸的是,我必须决定是否要使用此(我的)地图扩展方法,或者是否要使用ListExtensions.map方法。

有没有办法避免这个问题?我也对隐藏扩展方法/使用前置问题的一般答案感兴趣。

1 个答案:

答案 0 :(得分:1)

不幸的是,似乎没有关于如何处理优先级或如何隐藏隐式导入的xtend扩展的任何文档。

如果库方法和您的自定义方法具有明确的签名,则在使用静态扩展导入时它应该正常工作。我已经成功测试了这个:

package test1

class CustomListExtensions {

    static def <T, R> map(T original, (T)=>R transformation) {
        return transformation.apply(original);
    }
}

用法示例:

package test2

import static extension test1.CustomListExtensions.*

class Test1 {

    def static void main(String[] args) {

        // uses org.eclipse.xtext.xbase.lib.ListExtensions.map
        val mappedList = #["hello", "world"].map['''«it» has length «length»''']

        // uses test1.CustomListExtensions.map
        val mappedObject = "hello CustomListExtensions".map['''«it» has length «length»''']

        mappedList.forEach[println(it)]
        println(mappedObject)
    }

}

输出:

hello has length 5
world has length 5
hello CustomListExtensions has length 26

如果您使用扩展提供程序(使用非静态方法)而不是静态扩展导入,那么扩展提供程序似乎优先于库方法:

包test1

class CustomListExtensions2 {

    def <T, R> map(T original, (T)=>R transformation) {
        return transformation.apply(original);
    }
}

用法:

package test2

import test1.CustomListExtensions2

class Test2 {

    val extension CustomListExtensions2 = new CustomListExtensions2

    def void main() {

        // uses test1.CustomListExtensions.map (<List<String>, String>)
        val mappedObject1 = #["hello", "world"].map['''«it» has length «length»''']

        // uses test1.CustomListExtensions.map (<String, String>)
        val mappedObject2 = "hello CustomListExtensions".map['''«it» has length «length»''']

        println(mappedObject1)
        println(mappedObject2)
    }

}

输出:

[hello, world] has length 2
hello CustomListExtensions has length 26