class TestClass <T extends SuperClass>{
public List<T> doSmth(){
///....
List testObjects = []
testObjects.add(new T(arg))
return testObjects;
}
}
class SuperClass{
}
class A extends SuperClass{
A(Arg arg){
....
}
class B extends SuperClass{
B(Arg arg){
....
}
////////test
class Main{
List <A> a
List <B> b
Main(){
this.a = new TestClass<A>().doSmth()
this.b = new TestClass<B>().doSmth()
}
}
Run Code Online (Sandbox Code Playgroud)
在线发现异常(groovy.lang.GroovyRuntimeException: 找不到 SuperClass 的匹配构造函数)
testObjects.add(new T(arg))
Run Code Online (Sandbox Code Playgroud)
这是非常正确的,因为 SuperClass 没有构造函数。但是子类有一个并且它们都具有相同的签名,arg 具有相同的类型。
有人可以帮我找到解决问题的方法吗?
不幸的是,无法使用 . 创建泛型类型的新实例new T。所以你需要解决这个问题。
解决这个问题的一种方法是包含一个闭包参数,doSmth()为您创建实例。
public List<T> doSmth(Closure newT) {
List testObjects = []
testObjects.add(newT(arg))
return testObjects;
}
Run Code Online (Sandbox Code Playgroud)
并提供调用该方法时创建新实例的代码:
Main() {
this.a = new TestClass<A>().doSmth { new A(it) }
this.b = new TestClass<B>().doSmth { new B(it) }
}
Run Code Online (Sandbox Code Playgroud)