2017-10-01 11 views
2

説明:here:インターフェイス内の関数にボディがない場合、デフォルトでは抽象です。しかし、身体とのインターフェースの機能については何もありません。本文を持つ抽象メソッド

例:

interface MyInterface { 
    fun foo() { print("Something") } 
    fun bar() 
} 

fun main(args: Array<String>) { 
    println(MyInterface::foo.javaMethod) 
    println(MyInterface::bar.javaMethod) 
} 

出力は次のようになります。

それが可能だどのように
public abstract void MyInterface.foo() 
public abstract void MyInterface.bar() 

、定義されたボディと、そのメソッドは抽象的ですか?

答えて

7

これは、Kotlinインターフェイスのデフォルトメソッドの実装方法と関係があります。インタフェース内のfoobarメソッドは、どちらも抽象的なものです。

しかし、このような何か(簡体字)を探しますインターフェース内の内部クラスがある:

public interface MyInterface { 
    void foo(); 
    void bar(); 

    public static final class DefaultImpls { 
     public static void foo() { 
     System.out.print("Something"); 
     } 
    } 
} 

このクラスは、あなたの中に身体を与えた任意の関数のデフォルトの実装を含むものですインタフェース。その後

、あなたはこのインタフェースを実装するクラスを作成し、あなたがfooメソッドオーバーライドしない場合:

class MyClass: MyInterface { 
    override fun bar() { 
     println("MyClass") 
    } 
} 

次に、あなただけのDefaultImpls内の実装を呼び出し、自動的に生成されたものを、得る:

public final class MyClass implements MyInterface { 
    public void bar() { 
     System.out.println("MyClass"); 
    } 
    public void foo() { 
     MyInterface.DefaultImpls.foo(); 
    } 
} 

あなたはKotlinプラグインが付属してバイトコードビューアを使用して、すべてのこれらの詳細を見つけることができます

Tools -> Kotlin -> Show Kotlin Bytecode、次にDecompileオプション)。

+0

コンパイラがJava 8をターゲットにしていても同じですか?その場合、デフォルトメソッドとしてfoo()を定義していますか? –

+0

OOPについての多くの書籍は、抽象メソッドは宣言されているが実装は含まれていないメソッドであると書いています。説明をありがとう! – jQuick

+1

私が知る限り、同じ内部クラスのソリューションがJava 8ターゲットでも使用されています。組み込みデコンパイラとJD-GUIの両方でそれを見てください。 – zsmb13

関連する問題