Generics 带有<;T扩展超类>;

Generics 带有<;T扩展超类>;,generics,groovy,Generics,Groovy,这是非常正确的,因为超类没有构造函数。但是子类有一个,并且所有子类都有相同的签名,arg具有相同的类型 有人能帮我找到问题的解决方案吗?不幸的是,无法使用new T创建泛型类型的新实例。所以你需要解决这个问题 解决此问题的一种方法是在doSmth()中包含一个closure参数,用于为您创建实例 testObjects.add(new T(arg)) public List doSmth(闭包){ 列出testObjects=[] 添加(newT(arg)) 返回测试对象; } 并提供调用

这是非常正确的,因为超类没有构造函数。但是子类有一个,并且所有子类都有相同的签名,arg具有相同的类型


有人能帮我找到问题的解决方案吗?

不幸的是,无法使用
new T
创建泛型类型的新实例。所以你需要解决这个问题

解决此问题的一种方法是在
doSmth()
中包含一个closure参数,用于为您创建实例

 testObjects.add(new T(arg))
public List doSmth(闭包){
列出testObjects=[]
添加(newT(arg))
返回测试对象;
}
并提供调用该方法时创建新实例的代码:

public List<T> doSmth(Closure newT) {
    List testObjects = []
    testObjects.add(newT(arg))
    return testObjects;
}
Main(){
this.a=newtestclass().doSmth{new a(it)}
this.b=newtestclass().doSmth{new b(it)}
}

代码不起作用的原因是与
A
B
的构造函数不匹配。原因是缺少在
超类中接受字符串的构造函数
new T()
无法按预期工作。在您的代码中,它将成为新的超类(arg)
。下面的代码演示了它

Main() {
    this.a = new TestClass<A>().doSmth { new A(it) }
    this.b = new TestClass<B>().doSmth { new B(it) }
}
TestClass
将打印
对象
TestClass
将打印
A
,依此类推

Groovy在运行时没有泛型类型信息。Groovy甚至不进行编译类型检查(例如
newtestclass()
)。但它保留了一些信息,以使
newt()
起作用

Java的泛型实现包含一个称为“类型擦除”的特性,该特性在完成静态类型检查后“丢弃”泛型类型信息。这使得Java可以轻松地与遗留的“非泛型”库集成。Groovy目前做得更进一步,在“源代码级别”丢弃泛型信息。在适当的情况下,仿制药信息保存在签名中


A和B类在构造函数中都有相同类型的参数。
Main() {
    this.a = new TestClass<A>().doSmth { new A(it) }
    this.b = new TestClass<B>().doSmth { new B(it) }
}
class TestClass <T extends SuperClass> {
    public void doSmth(){
        println new T().class.simpleName;
    }
}

class SuperClass{}
class A extends SuperClass{}
class B extends SuperClass{}

new TestClass<A>().doSmth()
new TestClass<B>().doSmth()
new TestClass<String>().doSmth() //even this works
SuperClass
SuperClass
SuperClass