Java8允許我使用方法聲明作爲任何接口的實現,只要它只包含一個方法即可。如何更改函數引用的類型?
但是一旦被定義,類型不能被改變。
我的代碼:
import java.util.function.IntConsumer;
public class A {
interface MyConsumer {
void doSomething(int i);
}
public static void main(String[] args) {
IntConsumer i = A::consume;
MyConsumer i2 = A::consume;
IntConsumer i3 = (IntConsumer) i2; // ClassCastException
MyConsumer i4 = (MyConsumer) i; // ClassCastException
IntConsumer i5 = i2; // does not compile
MyConsumer i6 = i; // does not compile
IntConsumer i7 = i2::doSomething; // workaround, as suggested by @Eran http://stackoverflow.com/a/35846001/476791
MyConsumer i8 = i::accept;
Object i9 = A::consume; // does not compile
Object i10 = (IntConsumer) A::consume; // works
Object i11 = (MyConsumer) A::consume; // works
Object i12 = (MyConsumer) (IntConsumer) A::consume; // does not work
}
static void consume(int i) {
System.out.println(i);
}
}
注意:如果你直列一些變量,那麼一些非工作的例子突然開始工作。
我詳細的想法:
- 如果
IntConsumer i = A::consume
是有效的,那麼A::consume
有implement IntConsumer
- 如果
MyConsumer i2 = A::consume
是有效的,那麼A::consume
有implement MyConsumer
- 如果
A::consume
實現都,IntConsumer
和MyConsumer
,那麼應該可以鑄造
是否有另一種方法可以在之後「投射」或「改變」消費者類型?
我建議你閱讀'Functional Interface'和'方法參考'。你所看到的不是簡單的繼承。這些實現邏輯不適用於此。 – Codebender