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

使用通配符的Java集合

拓拔高畅
2023-03-14
问题内容
public static void main(String[] args) {

    List<? extends Object> mylist = new ArrayList<Object>();

    mylist.add("Java"); // compile error

}

上面的代码不允许您将元素添加到列表中,通配符只能用作方法中的签名,同样不能用于添加,而只能用于访问。在这种情况下,以上目的是什么?


问题答案:

假设您有一个接口和两个类:

interface IResult {}
class AResult implements IResult {}
class BResult implements IResult {}

然后,您将得到返回结果列表的类:

interface ITest<T extends IResult> {
  List<T> getResult();
}

class ATest implements ITest<AResult> {
  // look, overridden!
  List<AResult> getResult();
}

class BTest implements ITest<BResult> {
  // overridden again!
  List<BResult> getResult();
}

当您需要“协变量返回”,但是返回集合而不是自己的对象时,这是一个很好的解决方案。最大的好处是,当独立于ITest接口使用ATest和BTest时,不必强制转换对象。但是,使用ITest接口时,不能将任何东西添加到返回的列表中-
无法确定列表真正包含的对象类型!如果允许,则可以将BResult添加到List (作为List <?扩展T>返回),这没有任何意义。

因此,您必须记住以下内容:List <?X>扩展定义了一个可以轻松覆盖的列表,但它是只读的。



 类似资料:
  • 问题内容: 在以下情况下,我遇到了仿制药的问题,请参见以下内联注释,以了解我的问题: 问题答案: //Intuitively I would expect this to mean that test is set containing objects //that subclass AbstractGroup Set<? extends AbstractGroup> test; 不,这意味着它是

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

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

  • 问题内容: 为什么此代码无法编译(是接口)? 问题答案: 这样做是出于安全考虑。想象一下它是否有效: 含义是“ the是扩展了某种类型的列表Parent。我们不知道哪种类型-它可能是,或。” 这使得它的安全抓取任何物品出来的的,从API和转换T到Parent,但它不是安全地调用中的从转换到......因为转换可能是无效的。

  • 本文向大家介绍Java 泛型总结(三):通配符的使用,包括了Java 泛型总结(三):通配符的使用的使用技巧和注意事项,需要的朋友参考一下 简介 前两篇文章介绍了泛型的基本用法、类型擦除以及泛型数组。在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用。 这个系列的另外两篇文章: Java 泛型总结(一):基本用法与类型擦除 Java 泛型总结(二):泛型与数组 数组的协变 在了解通配符

  • 有办法实现这样的事情吗?这段代码与我想要实现的类似。 这里的问题是BiConsumer,我需要通配符是hashmap通配符的超级。 短绒是这样说的 但是,在执行,表示它需要是一种类型。但该类型当前是通配符。