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

泛型Java,无界通配符

麹高远
2023-03-14
问题内容

您好直接从Oracle
http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html提供的Java教程中

static void filter(Collection<?> c) {
    for (Iterator<?> it = c.iterator(); it.hasNext(); )
        if (!cond(it.next()))
            it.remove();
}

我知道编译时的类型擦除。而且我也知道,一个类型(无界)将被Object取代。知道在编译时如何使用无界通配符进行编译吗?只是删除它,因为它是原始类型?

提前致谢。


问题答案:

假设我们有一个通用声明

interface Foo<T>
    T get();
    void set(T);
    void bet();

原始类型Foo等效于声明为

interface Foo
    Object get();
    void set(Object);
    void bet();
    // all generics info are stripped

例如,在Java 5中List<E>,其原始版本List包含与java5之前的List接口完全相同的方法签名。原始类型用于向后兼容。

Raw List很接近List<Object>; 但是与List<?>

foo类型的对象Foo<?>的类型为

interface Foo<X>
    X get();
    void set(X);
    void bet();

对于某些确定的(尽管未知)类型X。尽管X是未知的,我们仍然可以调用foo.get()foo.bet()。但是我们无法调用,foo.set(a)因为无法知道是否a为未知类型X-除非anull



 类似资料:
  • 问题内容: 我有一个接口将对象转换为字符串: 以及用于存储所有可用转换器的地图: 现在,我有了要转换的异构数据列表,如下所示: 但是此代码无法编译: 我应该如何更改代码? 问题答案: 您面临的问题称为通配符捕获。Java无法识别将从数据中接收的类型。尝试以两种方式中的任何一种重构代码 方法1:如下 更改您的界面 方法2: 通过类型推断来捕获通配符的Helper方法 创建如下的帮助方法, 如下调用此

  • 根据Joshua Bloch的“有效Java”一书,关于如何/何时在泛型中使用有界通配符有一个规则。这个规则就是PECS(productor-extends,Comsumer-Super)。当我研究以下示例时: 根据PECS规则,上述声明是错误的。但是我希望有一个的,并向这个传递一个。为什么不做呢? 为什么要始终使用关键字?为什么使用是错误的? 当然,这也代表了Comsumer的观点。为什么消费者

  • 我正在与Java8通配符泛型作斗争。 假设一个名为的泛型类(来自Core Java book) 是因为Java8编译器转换吗?超级经理反对,因此任何事情都是允许的?

  • 上限通配符下限通配符 有人能帮我理解一下吗?

  • null 为什么我不能在MyList中添加对象。因为如果我们使用super,这意味着这个列表可以包含在Java类的继承制度中等于或高于number的对象。因此应该按照该语句在列表中添加新的Object()。 多谢了。

  • null 编译,我真的不明白为什么。基本上与第1行相同的问题。是的超类,如何将超类的成员放入此中? 编译。与第1行相同的问题。