首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><T扩展SuperClass>的Groovy泛型问题

<T扩展SuperClass>的Groovy泛型问题
EN

Stack Overflow用户
提问于 2016-04-02 16:48:20
回答 2查看 1.2K关注 0票数 5
代码语言:javascript
复制
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构造函数)

代码语言:javascript
复制
 testObjects.add(new T(arg))

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

有人能帮我找到解决问题的办法吗?

EN

回答 2

Stack Overflow用户

发布于 2016-04-02 19:01:55

代码不能工作的原因是AB的构造函数不匹配。原因是缺少接受SuperClass中字符串的构造函数。

new T()并不像您期望的那样工作。在你的代码中,它变成了new SuperClass(arg)。下面的代码演示了这一点

代码语言:javascript
复制
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

输出为

代码语言:javascript
复制
SuperClass
SuperClass
SuperClass

TestClass <T>将打印ObjectTestClass <T extends A>将打印A等。

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

Java的泛型实现包含一个称为“类型擦除”的特性,该特性在完成静态类型检查后“丢弃”泛型类型信息。这使得Java可以轻松地与遗留的“非泛型”库集成。Groovy目前做得更进一步,“在源代码级”抛弃了泛型信息。泛型信息保存在适当的签名内http://web.archive.org/web/20150102195947/http://groovy.codehaus.org/Generics

票数 4
EN

Stack Overflow用户

发布于 2016-04-02 18:10:18

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

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

代码语言:javascript
复制
public List<T> doSmth(Closure newT) {
    List testObjects = []
    testObjects.add(newT(arg))
    return testObjects;
}

并提供在调用该方法时创建新实例的代码:

代码语言:javascript
复制
Main() {
    this.a = new TestClass<A>().doSmth { new A(it) }
    this.b = new TestClass<B>().doSmth { new B(it) }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36371166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档