簡體   English   中英

Java參數簽名解析

[英]Java parametric signature resolution

為什么此代碼顯示2.0而不是1.0?

abstract class B<T extends Number> {
    abstract Number f(T j);
}

class A<T extends Number> extends B<T> {
    public Number f(Float j) {
        return 1f;
    }

    public Number f(T j) {
        return j;
    }
}

public class J {
    public static void main(String[] args) {
        B<Float> a = new A<>();
        Number r = a.f(2f);
        System.out.println(r);
    }
}

你在期待什么 您只有在類B中聲明的一種方法:

abstract Number f(T j);

A類中的方法

public Number f(Float j);

不覆蓋前者。 它們具有不同的簽名。 所以方法

public Number f(T j) {
    return j;
}

被叫。

因此,這里問題的核心在於,您已將變量a聲明為B類型。 由於B類只有一種方法,那就是獲勝的方法。 然而,在你的main ,如果你改變的類型, a是類型的A ,你會發現它不能編譯,因為它是不明確的。 但是,如果您確實將類A的方法更改為接受原語,並且在main()方法中將變量a定義為A類型,則結果為1.0 即,以下將導致打印1.0

class A<T extends Number> extends B<T> {
    public Number f(float j) {
        return 1f;
    }

    public Number f(T j) {
        return j;
    }
}


public class J {
    public static void main(String[] args) {
        A<Float> a = new A<>();
        Number r = a.f(2f);
        System.out.println(r);
    }
}

在下面的代碼中

abstract class B<T extends Number> {
 abstract Number f(T j);
}

class A<T extends Number> extends B<T> {
    public Number f(Float j) //this method does not override the superclass method

    {
        return 1f;
    }

    public Number f(T j) {
        return j;
    }
}

public class J {
    public static void main(String[] args) {
        B<Float> a = new A<>();
        Number r = a.f(2f);
        System.out.println(r);
    }
}

發生對af(2f)的調用時,它將調用

public Number f(T j)
{
return j;
}

返回j從而提供的輸出是2.0

floatFloat

自動裝箱使它具有相同的感覺 ,但主要區別在於您不能將null傳遞給float參數。

我建議在您的重寫方法上使用@Override批注,這樣編譯器會告訴您簽名是否正確

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM