当前位置: 首页 > 面试题库 >

具有其他类型的Collection getter的泛型类

慎懿轩
2023-03-14
问题内容

目前,我在Java中遇到通用类问题。

我有这样的事情:

public class GenericClass<T> {
    T doSomething() {...}

    Collection<String> getCollection() {...}
}

现在,我实例化了一个没有类型参数的类的对象,因为我对此没有兴趣或不知道。

GenericClass obj = new GenericClass();
for (String str : obj.getCollection() { // won't work
    ...
}

问题是,尽管编译器不依赖于参数,但它不仅丢弃有关类型参数的信息,而且还丢弃有关集合(字符串)的类型的信息。

我是在做错什么,还是Java的限制?如果是这样,那为什么会有限制?


问题答案:

你做错了

如果您不知道T类型,则只需使用通配符:

GenericClass<?>。实例化new时,您无法执行此操作GenericClass,因此只需使用Object:

GenericClass<?> obj = new GenericClass<Object>();

出于向后兼容的原因,故意使一个根本没有任何泛型信息(GenericClass没有任何信息<>)的类失去了所有泛型类型安全性,因此可以将其与前泛型代码安全地使用。



 类似资料:
  • 我正在尝试用来自spring WebFlux的WebClient制作一个客户端库。 服务器返回如下JSON所示的响应: 结果字段包含元素数组,这些元素可以根据使用的API而不同。 有关该API的更多信息,请参阅ServiceNow产品中的表API。 正如您在文档中所看到的,API路径如下所示:GET/now/table/{tableName},其中tableName可以是不同的值,tipology

  • 问题内容: 所以我有一张地图: 我会像这样添加元素: 我有如下通用方法: 现在,这段代码可以很好地工作,并且没有编译器问题: 但是,当我尝试这样做时: 编译器向我显示以下警告:类型安全:通用方法verifyType(String,Class)的未经检查的调用verifyType(String,Class) 这让我感到困惑…请帮助… 问题答案: 更改: 至 通过仅将类型声明为“ Class”,就失去

  • 在java 8中创建新代码后,我想清除声纳问题。 我的代码: 声纳说: Lambda应该替换为方法引用。方法/构造函数引用比使用lambda更紧凑和可读性,因此是首选。同样,空检查可以替换为对Object::isNull和Object::nonNull方法的引用。 我想要更改映射(arg-

  • 我试图在一个方法中使用泛型,在这个方法中,我将一个json反序列化为pojo,这样它就可以返回任何对象类型。 这里我的代码: 问题是

  • “绑定不匹配:Team类型不是league类型 的有界参数 >的有效替代品。”

  • 或者我只是混淆了概念,存在类型和泛型意味着完全不同的东西。请帮我弄明白。