-2

現在、JDK 1.8 でラムダ式を学習しています。私が理解していないことがわかったいくつかのコードに出くわしました。

コードは次のとおりです。

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.lang.Comparable;

/**
 * Hello world!
 *
 */
public class App
{
    public static void main( String[] args ) throws Exception
    {

        List<String> list = Arrays.asList("a", "b", "c");
        sort(list, Comparable::<String>compareTo);

    }

    interface MyComparable {
        public <T extends Comparable<T>> int compare(T obj1, T obj2 );
    }

    public static <T extends Comparable<T>> void sort(List<T> list, MyComparable comp) {

        int n = comp.compare("5","2");
        System.out.println(n);
    }

}

comp.compare("5", "3")最終的に実行され"5".compareTo("2")ます。私の理解では、コンパイラは同じ署名を持つ静的メソッドを見つける必要があるということでした

public <T extends Comparable<T>> int compare(T obj1, T obj2 );

私はそのような方法を作成しましたが、それは機能します。Java コンパイラが を呼び出す理由がわかりません"5".compareTo("2")。それらのメソッド シグネチャは同じではありません。

コンパイラがこの種のコードを生成する理由に関する情報はありますか?

4

2 に答える 2