在Groovy中,我可以对POJO类覆盖Java风格转换语法?

问题描述 投票:-1回答:2

我希望能够使用纯Java风格的隐性/明确的铸造,而不是asType覆盖,使得用Java编写的源正常工作。我已经覆盖asType上串类似的做法,像How to overload some Groovy Type conversion for avoiding try/catch of NumberFormatException?建议:

oldAsType = String.metaClass.getMetaMethod("asType", [Class] as Class[])
String.metaClass.asType = {Class typ ->
    if (Foo.class.isAssignableFrom(typ)) {
        Foo.myCast(delegate)
    } else {
        oldAsType.invoke(delegate,typ)
    }
}

我想所有这些选项的工作:

// groovy
String barString
Foo foo = barString asType(Foo.class)  // asType works but
Foo foo = barString           // implicit cast fails
Foo foo = (Foo) barString     // explicit cast fails

后两个失败,因为常规使用DefaultTypeTransformation.castToType,不尝试调用new Foo()除非被投的对象是特殊情况下的转换的一个或为某种集合类型。

需要注意的是该解决方案Can I override cast operator in Groovy?不能解决问题,因为是做铸造的代码是我无法改变,至少不会在源代码级常规的Java代码。我希望有任何一个秘密勾成铸造或方法来覆盖静态castToType方法(在Java类中,通过另一个Java类中调用 - 这Can you use Groovy meta programming to override a private method on a Java class说的是不支持的)......或其他一些聪明的做法我的避风港的“T思想。

编辑:现在的问题是如何使用Java风格的转换语法,基本上是使用Groovy设施添加一个自动装箱方法。 Groovy中调用这个机制“铸造”,是好还是坏(见DefaultTypeTransformation.castToType如上面提到的)。特别是,我已经取代枚举与资源匮乏类,并要保留JSON序列化。 Groovy的JSON包自动UN /实例成员为字符串的乘警枚举值和我想要以最少的改动源代码,以使替换类序列化兼容。

groovy
2个回答
0
投票

这里的问题的一部分是你混淆转换与铸造。使用“为”运营商是不一样的东西强加演员。他们似乎相似,但它们服务于不同的用途。

Foo foo = (Foo) barString 

这并不是说,像“出barString的创建富”。上面写着“声明一个名为foo参考,静态类型美孚与参考相关联,然后指向上,参考目前barString指向堆上的对象引用。”不像C ++一样,Groovy和Java语言不允许你曾经获得的情况下,在一个对象,它是一类是与参考的类型不兼容的一个参考点。如果你陷入其中一个Foo提到指着堆一个字符串的情况下,这将是在JVM中的错误。它不能这样做。你能想出的方法来创建对象的Foo出String对象,但不是什么上面的代码是什么。


0
投票

答案似乎是“不”。如果缺少DefaultTypeTransformation.castToType的重写,以允许这种元编程的,寓意是用另一种实现策略或使用不同的语言。

© www.soinside.com 2019 - 2024. All rights reserved.