【问题标题】:Difference between "? extends Stream<? extends R>" and "Stream<? extends R>""? extends Stream<? extends R>" 和 "Stream<? extends R>" 的区别
【发布时间】:2021-01-14 15:38:18
【问题描述】:

有什么区别

?扩展流

&lt;R&gt; Stream&lt;R&gt; flatMap(Function&lt;? super T,? extends Stream&lt;? extends R&gt;&gt; mapper) 是否与&lt;R&gt; Stream&lt;R&gt; flatMap(Function&lt;? super T, Stream&lt;? extends R&gt;&gt; mapper) 相同。

你能举几个例子吗?

【问题讨论】:

  • Function&lt;InType, SpecificStreamType&gt; 匹配第一个但不匹配第二个。

标签: java generics wildcard flatmap


【解决方案1】:

简答:? extends SomeTypeSomeType 非常不同。

更长的答案:

Stream&lt;extends R&gt; 用作SomeType 会使示例混淆。要回答这个问题,请考虑一个更简单的比较,例如:

? extends Integer

Integer

第一个观察结果是? extends Integer 作为类型表达式只能在泛型声明中使用。另一方面,Integer 可以用在更多地方。

这里有一些代码示例来帮助展示差异:

    // The following do not compile:
    //
    // Syntax error on tokens, delete these tokens ('? extends').
    //
    // private Integer value;
    // public ? extends Integer getValue() {
    //     return value;
    // }
    //
    // Syntax error on tokens, delete these tokens ('? extends').
    //
    // private Integer value;
    // public void setInteger(? extends Integer value) {
    //     this.value = value;
    // }
    //
    // In both cases, the use of bounded quantification ('? extends') is
    // not valid outside of a generic type declaration.

    // Here is a very basic example of the use of generics:
    //
    // Generic 'Wrapped' is quantified on a single type, which
    // is unrestricted:

    public class Wrapped<T> {
        Wrapped() { this.value = null; }
        Wrapped(T value) { this.value = value; }
        private T value;
        public void set(T value) { this.value = value; }
        public T get() { return value; }
    }

    // The following is also valid:
    //
    // 'Wrapped_1' is quantified on a single type, which is restricted
    // to be 'Integer' or a subtype of 'Integer'.

    public class Wrapped_1<T extends Integer> {
        // EMPTY
    }
    
    // This is not valid.  In addition to being non-valid syntacticly,
    // the declaration needs a specific type.  Use of a wildcard does
    // not provide a specific type.
    //
    // Syntax error on token "?", Identifier expected
    //
    // public class Wrapped_2<? extends Integer> {
    // }

    // The following does not compile:
    //
    // Cannot instantiate the type Wrapped<? extends Integer>.
    // Type mismatch: cannot convert from Wrapped<? extends Integer> to Wrapped<Integer>.
    //
    // private Wrapped<Integer> Wrapped0 = new Wrapped<? extends Integer>();

    // These show the difference in effect between the declarations
    // 'Integer' and '? extends Integer'.

    private Wrapped<Integer> wrapped_1 = new Wrapped<Integer>( new Integer(4) );
    private Wrapped<? extends Integer> wrapped_2 = wrapped_1;
    
    {
        // This compiles:
        wrapped_1.set( new Integer(5) );

        // This does not compile:
        //
        // The method set(capture#1-of ? extends Integer)
        // in the type Wrapped<capture#1-of ? extends Integer>
        // is not applicable for the arguments (Integer)
        //
        // wrapped2.set( new Integer(6) );
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2011-02-15
    • 2016-08-11
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多