【问题标题】:Java generics meaning of <?> [duplicate]<?>的Java泛型含义[重复]
【发布时间】:2015-08-20 17:35:52
【问题描述】:

有时我会看到类似的 java 代码

Class<?>

我不明白它的正确含义。

如果我看到类似:

ComboBox<Order> box = new ComboBox<>();

那么很明显,该框只能包含 Order 类中的对象,但是 &lt;?&gt; 呢?它是等于还是完全不同的东西?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    它被称为通配符,它只是意味着您不需要指定泛型类型。它有时很有用,但一般不应该使用。可以安全使用它的一种情况是使用类型绑定:

    public void withWildCard(List<? extends Collection<Integer>> collections) { 
        ...
    }
    
    public void withoutWildCard(List<Collection<Integer>> collections) { 
        ...
    }
    
    List<Collection<Integer>> listOfCollections;
    withWildcard(listOfCollections); // valid call
    withoutWildcard(listOfCollections); // valid call
    
    List<List<Integer>> listOfLists;
    withWildcard(listOfLists); // valid call becase List is a subclass of Collection
    withoutWildcard(listOfLists); // invalid call, does not compile because List does not match Collection
    

    顺便说一句,你问题中的 sn-p 是错误的。应该是

    ComboBox<Order> box = new ComboBox<>();
    

    如果在声明端没有指定泛型类型,编译器将无法推断菱形运算符的类型 (&lt;&gt;)。

    【讨论】:

    • 请检查您的答案。我看不出这两种方法有什么区别
    • 哈哈,复制粘贴不好...谢谢,我修好了
    • 那么'>'是否等于''?
    • 这就是它的编译方式,但实际上并不等同。例如你不能做List&lt;Object&gt; x = ...; List&lt;?&gt; y = x。实际上,我用List&lt;?&gt; 尝试了一些东西,但我无法向它添加任何东西,而它对于List&lt;Object&gt; 编译得很好。这让我觉得?仅应在类型有限制时使用(例如? super A,否则您对类型完全没有线索
    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 2010-09-26
    • 2014-01-12
    • 2018-04-27
    • 2015-10-08
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多