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

Java中的通用集合和通配符

韩晋
2023-03-14
问题内容

在以下情况下,我遇到了仿制药的问题,请参见以下内联注释,以了解我的问题:

public void exampleMethod() {
    //Intuitively I would expect this to mean that test is set containing objects 
    //that subclass AbstractGroup
    Set<? extends AbstractGroup> test;

    //Yet the compiler complains here and I do not understand why?

    test.add(new AnyAbstractGroupSubGroup());

    //I would guess that a method call such as this at runtime

    test = new HashSet<SubGroupA>()

    //would mean that only objects of subgroupA can be added to the collection, but then
    //what is the point in using the wildcard in the first place?  
}

问题答案:

//Intuitively I would expect this to mean that test is set containing objects
//that subclass AbstractGroup
Set<? extends AbstractGroup> test;

不,这意味着它是一组特定的?扩展了AbstractGroup。而且您和编译器都无法知道那吗?是的,因此您无法向该Set添加任何东西。

您可以将集合的值分配给AbstractGroup类型的变量,但不能相反。

相反,您需要这样做:

Set<? super AbstractGroup> test;

该原理有时称为PECS,并且在此答案中得到了很好的解释。



 类似资料:
  • 问题内容: 上面的代码不允许您将元素添加到列表中,通配符只能用作方法中的签名,同样不能用于添加,而只能用于访问。在这种情况下,以上目的是什么? 问题答案: 假设您有一个接口和两个类: 然后,您将得到返回结果列表的类: 当您需要“协变量返回”,但是返回集合而不是自己的对象时,这是一个很好的解决方案。最大的好处是,当独立于ITest接口使用ATest和BTest时,不必强制转换对象。但是,使用ITes

  • 问题内容: 这样编译(1.6) 但这不是 的错误 有人可以解释为什么吗?谢谢 编辑:编辑为结果 问题答案: 因为这会破坏类型安全性:

  • 问题内容: 为什么使用此Java代码会出现编译器错误? 其中“ SubFoo”是实现Foo的具体类,而Foo是接口。 我收到此代码错误: 在第3行上:“无法实例化ArrayList <?扩展了Foo>” 在第4行上:“类型List 中的方法add(capture#1-of扩展Foo)不适用于参数(SubFoo)” 更新: 感谢Jeff C,我可以将第3行更改为“ new ArrayList ();

  • 问题内容: 我正在编写一个简单的调试程序,该程序将简单的字符串作为输入,其中可以包含星号以指示通配符匹配-任何 我以为我会简单地采用该模式,转义其中的任何正则表达式特殊字符,然后将其替换为。然后使用正则表达式匹配器。 但是我找不到任何Java函数来转义正则表达式。我能找到的最佳匹配,然而这正好将与在开始和字符串的结尾。 Java中有什么可以让您简单地进行通配符匹配而不必从头开始实现算法的? 问题答

  • 问题内容: 我要实现以下功能: 如何检查向量元素类型? 请注意, 向量可能为空,因此我无法检查第一个元素是“ instanceof”整数还是String … 编辑: 好吧,我脑子里有个念头,我不知道它是否会起作用 我可以按以下方式实现checkType函数: 是否可以检查T是否为整数?! 提前致谢 问题答案: *由于 类型擦除, *泛型类型参数 在运行时不可恢复(某些特殊情况除外)。这意味着在运行

  • 问题内容: 我正在尝试通过使用删除垃圾文件 只要我不使用通配符,它​​就可以正常工作,即,这有效: 而以下内容返回“没有此类文件或目录”: 我应该能够做到这里概述的所有美好的事情,对吗? 问题答案: 我可能建议您让Java为您执行此操作? 使用file.listFiles()获取文件列表 如果需要,使用file.getName()。contains(string)对其进行过滤 遍历执行file.d