繁体   English   中英

具有泛型类的构造函数未定义

[英]Constructor with generic class is undefined

我遇到了一个我不明白的愚蠢问题。

class Foo<T extends Collection<E>, E> {
  private Class<T> collectionClass;
  private Class<E> elementClass;

  public Foo(Class<T> collectionClass, Class<E> elementClass) {
       this.collectionClass = collectionClass;
       this.elementClass = elementClass;
  }
} 

当我试图运行这个

Foo<Collection<String>, String> foo = 
    new Foo<Collection<String>, String>(
        Collection.class,
        String.class);

我收到编译器错误

java.lang.Error: Unresolved compilation problem: 
The constructor Foo<Collection<String>,String>(Class<Collection>, Class<String>) is undefined

为什么? 如果我擦除泛型,那没关系

Foo foo = 
    new Foo(
        Collection.class,
        String.class);

如果有人有想法,那就太棒了,不要让我把头撞到墙上。

没有Collection<String>.class这样的东西就是问题所在。 你的选择包括

  • 不要使用反射; 你为什么用反射?
  • 接受不安全演员的需要
  • 使用各种工具之一在运行时引用泛型类型,例如Guava的TypeToken

你无能为力。 只是围绕它

new Foo<Collection<String>, String>(
    (Class<Collection<String>>)(Class<?>)Collection.class,
    String.class);

没有运气,因为类型擦除,请看这个问题

但是,原始集合类和元素类可用于生成类型安全的Collection<String>对象。 因此,删除集合中E的冗余,作为集合。

对于您的用例,您可以放松构造函数参数类型

public Foo(Class<?> collectionClass, Class<E> elementClass) 
{
    this.collectionClass = (Class<T>)collectionClass;
    this.elementClass = elementClass;
}

Foo<Collection<String>, String> foo = new Foo<>(Collection.class, String.class);

类型检查较少,因此用户必须确保未传入错误的类,例如

Foo<Set<String>, String> foo = new Foo<>(List.class, String.class);
    ^^^                                  ^^^^

好,

我看过别人的答案而不是最好的......

在Oreilly Tiger书中(对于第5版)(p167),他们做了一个非常明确的陈述,即构造函数在其签名中不能有通配符......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM