web-dev-qa-db-ja.com

Javaパラメータのタイププロモーション]

このスニペットにつまずいた:

public class ParamTest {
    public static void printSum(int a, double b) {
        System.out.println("In intDBL " + (a + b));
    }

    public static void printSum(long a, long b) {
        System.out.println("In long " + (a + b));
    }

    public static void printSum(double a, long b) {
        System.out.println("In doubleLONG " + (a + b));
    }

    public static void main(String[] args) {
        printSum(1, 2);
    }
}
 _

これによりコンパイルエラーが発生します。

エラー:(15,9)Java:PrintSumへの参照は、ParamTestとMethod PrintSum(Long、Long)のparamtest matchのメソッドprintsum(int、double)の両方があいまいです

これはどのようにあいまいですか?最初のパラメータはすでにINTであるため、この場合は2番目のパラメータだけを宣伝する必要がありますか?この場合、最初のパラメータは昇格する必要はありませんか?

別のメソッドを追加するためにコードを更新した場合、コンパイルは成功します。

public static void printSum(int a, long b) {
    System.out.println(String.format("%s, %s ", a, b));
}
 _

明確にするために展開させてください。以下のコードはあいまいさをもたらします:

public class ParamTest {

    public static void printSum(int a, double b) {
        System.out.println("In intDBL " + (a + b));
    }

    public static void printSum(long a, long b) {
        System.out.println("In long " + (a + b));
    }

    public static void main(String[] args) {
        printSum(1, 2);
    }
}
 _

その後、このコードはまた曖昧さをもたらします。

public class ParamTest {

    public static void printSum(int a, double b) {
        System.out.println("In intDBL " + (a + b));
    }

    public static void printSum(double a, long b) {
        System.out.println("In doubleLONG " + (a + b));
    }

    public static void main(String[] args) {
        printSum(1, 2);
    }
}
 _

ただし、これはそうではありませんあいまいさをもたらす:

public class ParamTest {

    public static void printSum(int a, double b) {
        System.out.println("In intDBL " + (a + b));
    }

    public static void printSum(long a, double b) {
        System.out.println("In longDBL " + (a + b));
    }

    public static void main(String[] args) {
        printSum(1, 2);
    }
}
 _
20
riruzen

int値はJavaのdoubleと見なすこともできます。 _double a = 3_は長い_long b = 3_で有効で同じです。そのため、あいまいさを作成している理由です。あなたが呼ぶ

_printSum(1, 2);
_

これら3つすべてが有効であるため、3つのメソッドすべてを混乱させています。

_int a = 1;
double b =1;
long c = 1;
_

最後にLを設定して、長い値であることを指定できます。例えば:

_printSum(1L, 2L);
_

ダブルのためにそれを変換する必要があります。

_printSum((double)1, 2L);
_

@Erowin Bolwidtのコメントも読みます

0
Sandeep Kokate