gpt4 book ai didi

generics - 的 Groovy 泛型问题

转载 作者:行者123 更新时间:2023-12-03 16:06:13 27 4
gpt4 key购买 nike

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()
}
}

在线发现异常(groovy.lang.GroovyRuntimeException: 找不到 SuperClass 的匹配构造函数)
 testObjects.add(new T(arg))

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

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

最佳答案

你的代码不工作的原因是不匹配 A 的构造函数和 B .原因是缺少接受字符串的构造函数 SuperClass . new T()不像你期望的那样工作。在你的代码中它变成 new SuperClass(arg) .下面的代码演示了它

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
TestClass <T>将打印 Object . TestClass <T extends A>将打印 A等等。

Groovy 在运行时没有泛型类型信息。 Groovy 甚至不进行编译类型检查(例如 new TestClass<String>() )。但它保留了一些信息来制作 new T()工作。

Java's generics implementation incorporates a feature known as "type erasure" which "throws away" generic type information after completing static type checking. This allows Java to easily integrate with legacy "non-generics" libraries. Groovy currently does a little further and throws away generics information "at the source level". Generics information is kept within signatures where appropriate http://web.archive.org/web/20150102195947/http://groovy.codehaus.org/Generics

关于generics - <T extends SuperClass> 的 Groovy 泛型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36371166/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com