簡體   English   中英

在Java中重載方法

[英]Overloading of methods in Java

在以下代碼段中,有一個名為show()的方法的三個版本。

package overloading;

import java.util.ArrayList;
import java.util.List;

public final class Main
{
    private void show(Object object)
    {
        System.out.println("Object");
    }

    private void show(List<Object> list)  //Unused method
    {
        System.out.println("List");
    }

    private void show(Object[] objects)
    {
        System.out.println("Objects");
    }

    private void addToList()
    {
        List<String>list=new ArrayList<String>();
        list.add("String1");
        list.add("String2");
        list.add("String3");
        show(list); // Invokes the first version

        String []s={"111", "222", "333"};
        show(s);   // Invokes the last version
    }

    public static void main(String[] args)
    {
        new Main().addToList();
    }
}

在這個最簡單的Java代碼中,這個方法調用show(s); addToList()方法中的最后一行)調用重載方法的最后一個版本 它提供了一個字符串數組 - String[] ,它被Object[]類型的接收參數接受。

這個函數調用show(list); 但是嘗試調用重載方法的第一個版本 它傳遞一個類型字符串List<String> - List<String> ,它應該被接收參數類型為List<Object>的中間版本接受。方法的中間版本是完全未使用的。 如果刪除了第一個版本,則是編譯時錯誤。

為什么這個電話show(list); 調用此版本 - private void show(List<Object> list){} - 中間版本?

簡而言之, List<Object>不是List<String>

要“修復”您的代碼,請使用以下代碼

private void show(List<? extends Object> list)
{
    System.out.println("List");
}

與數組(在Java中是協變的)不同,泛型類型的不同實例化彼此不兼容,甚至不是顯式的。

聲明Generic<Supertype> superGeneric; Generic<Subtype> subGeneric; Generic<Supertype> superGeneric; Generic<Subtype> subGeneric; 編譯器將報告兩個(Generic<Subtype>)superGeneric(Generic<Supertype>)subGeneric (Generic<Subtype>)superGeneric的轉換錯誤。

如果通配符可以軟化這種不兼容性? 用作實際類型參數: Generic<?>是泛型類型的所有實例化的抽象超類型。

List<Object>不是java中List<String>的超類。 您所假設的是Java在泛型上具有協方差,但它沒有。

這意味着如果AB的超類, List<A>不是List<B>的超類

無法將泛型轉換為擴展嵌套類型時遇到了類似的問題,您可以看看是否有適合您的工作。

或許改變

private void show(List<Object> list)

private void show(List<? extends Object> list)

會像你期望的那樣工作嗎?

我會說這是因為參數不同, List <Object>List <String> List <Object>不同因此當你調用重載方法時,默認為第一個只接受一個Object。

這是一個簡短的例子:

public class Test
{
  public static void overload (Object o)
  {
    System.out.println ("Object");

  }

   public static void overload (List <Object> o)
  {
    System.out.println ("List Object");
  }

   public static void main (String [] args)
   {
     overload (new ArrayList <Object>()); //"List Object"
     overload (new ArrayList <String>()); //"Object"

   }
}

使用泛型參數化列表,一切都應該有效。

暫無
暫無

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

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