<T extends SuperClass> 的 Groovy 泛型问题

And*_*nov 5 generics groovy

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 具有相同的类型。

有人可以帮我找到解决问题的方法吗?

Ste*_*nar 3

不幸的是,无法使用 . 创建泛型类型的新实例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)