相关疑难解决方法(0)

适配器模式:类适配器与对象适配器

我有一些关于适配器模式的问题.我知道类适配器继承自adaptee,而对象适配器将adaptee作为对象而不是继承自它.

您何时在对象适配器上使用类适配器,反之亦然?另外,使用类适配器和对象适配器的权衡取舍有哪些权衡?

oop design-patterns software-design adapter

31
推荐指数
3
解决办法
1万
查看次数

转换Java功能接口

一如既往,我正在查看JDK 8源代码并发现非常有趣的代码:

@Override
default void forEachRemaining(Consumer<? super Integer> action) {
    if (action instanceof IntConsumer) {
        forEachRemaining((IntConsumer) action);
    } 
}
Run Code Online (Sandbox Code Playgroud)

问题是:怎么Consumer<? super Integer>可能是一个实例 IntConsumer?因为他们处于不同的等级.

我已经制作了类似的代码片段来测试:

public class InterfaceExample {
    public static void main(String[] args) {
        IntConsumer intConsumer = i -> { };
        Consumer<Integer> a = (Consumer<Integer>) intConsumer;

        a.accept(123);
    }
}
Run Code Online (Sandbox Code Playgroud)

但它抛出ClassCastException:

Exception in thread "main" 
    java.lang.ClassCastException: 
       com.example.InterfaceExample$$Lambda$1/764977973 
     cannot be cast to 
       java.util.function.Consumer
Run Code Online (Sandbox Code Playgroud)

你可以在java.util.Spliterator.OfInt#forEachRemaining(java.util.function.Consumer)找到这段代码.

java lambda classcastexception java-8 functional-interface

25
推荐指数
3
解决办法
4182
查看次数