所以我遇到与here和here相同的问题。我有课程A
和B
。 A
将由B
修饰。为了保存我的一些输入,我使用@delegate
groovy注释,以便groovy处理对B
方法的所有调用,并自动将它们分配到A
类型对象,该对象保存在{{ 1}}。
这很好用,但我没有得到编译器的任何帮助。如果我尝试B
,那么编译器就不够聪明了,这个方法调用将被委托给myB.someMethodOfClassA()
并且A
中存在这样的方法,所以它标记了它没有找到 - 在运行时它仍然可以工作。
我可以通过让A
从B
延伸来解决这个问题。但是,然后在初始化B时调用A
的默认构造函数,如果没有,则当然失败。
一个(干净的)解决方案是创建A
并让AInterface
和A
实现它。有没有另外(干净)的方式做我想要的,而不必一直创建一个接口? (如果B
不在我的控制范围内,我甚至可能无法做到这一点)
以下是继承的示例:
A
以下类应该像oldClass一样使用,但添加另一个方法
public class OldClass {
public String name
public OldClass(String name) { this.name = name }
public sayHello() { println "hello $name" }
}
我现在可以这样使用它:
public class NewClass {
@Delegate OldClass delegationForOldClass
public NewClass(String name) { this.delegationForOldClass = new OldClass(name) }
public sayGoodbye() { println "byebye" }
}
所以它在运行时编译并运行,即使我没有因为注释而在NewClass myNewClass = NewClass("James")
myNewClass.sayHello() //prints "hello James" because the @Delegation annotation delegates the call to the OldClass object
myNewClass.sayGoodbye() //prints "bye"
扩展。但是,当我OldClass
myNewClass.sayHello()
可能不存在时,IDE编译器会抱怨(在编译时)。使用代码完成时,他也没有告诉我这种方法。因此,为了能够使用代码完成,我可以这样做:
sayHello
但是只有public class NewClass extends OldClass {
@Delegate OldClass delegationForOldClass
public newClass(String name) { this.delegationForOldClass = new OldClass(name) }
public sayGoodbye() { println "byebye" }
}
的作品才有空构造函数。但事实并非如此,它只有一个带字符串的构造函数。所以groovy尝试调用默认构造函数,因为extends关键字(它在java中是一样的吗?)当然失败了。如果我向OldClass
添加一个默认构造函数,那么它将起作用,但我不想这样做。
有没有办法解决这种问题?