/ / Щодо методу перевантаження в java [дублікат] - java

Що стосується перевантаження методу в java [duplicate] - java

Я переживав метод перевантаження в Java, і я намагався вивести програму нижче в затемненні, програма ..

public class OverloadingTest {

public static void main(String args[]){
List abc = new ArrayList();
List bcd = new LinkedList();

ConfusingOverloading co = new ConfusingOverloading();
co.hasDuplicates(abc); //should call to ArryList overloaded method
co.hasDuplicates(bcd); //should call to LinkedList overloaded method
}


}

class ConfusingOverloading{

public boolean hasDuplicates (List collection){
System.out.println("overloaded method with Type List ");
return true;
}

public boolean hasDuplicates (ArrayList collection){
System.out.println("overloaded method with Type ArrayList ");
return true;
}


public boolean hasDuplicates (LinkedList collection){
System.out.println("overloaded method with Type LinkedList ");
return true;
}

}

а вихід ..

Output
overloaded method with Type List
overloaded method with Type List

Тепер у поясненні було сказано .. Перевантаження методу вирішується під час компіляції за допомогою статичного прив'язки на Java, тому, будь ласка, порадьте, як я можу досягти цього за допомогою переосмислення методу.

Відповіді:

1 для відповіді № 1

abc,bcd обидва мають тип List навіть коли ви ініціалізуєте його з a subclassзвідси результат

BaseClass, як List допомагає написати методи, які можуть працювати з будь-яким підкласом (ArrayList або LinkedList). Тому,

public ArrayListLinkedListCanCallMe(List lst)
{
//now imagine if this method was called with bcd as parameter
//still lst would be of type List not LinkedList
//and if lst were allowed to be of type LinkedList then how could List know any
//of the methods of LinkedList.Therefore lst would always be of type List NOT LinkedList
}

Замість цього можете спробувати

co.hasDuplicates((ArrayList)abc);
co.hasDuplicates((LinkedList)bcd);

Але (ArrayList)abc може кинути виключення, якщо abc має тип LinkedList.Ви можете використовувати instanceof оператор, щоб перевірити, чи abc типу ArrayList а потім киньте його ..


0 для відповіді № 2

У цьому конкретному випадку, якщо hasDupplictes означаєщо там сказано, я мав би один метод, який бере Аргумент як аргумент. Він просто створить HashSet, ініціалізований зі вмістом списку, та порівняє його розмір із розміром списку.

Якщо вам дійсно потрібен спеціальний код справи, наприклад, ArrayList ви можете використовувати instanceof в методі аргументу List.

Однак, коли ви працюєте з інтерфейсомвведіть це набагато, набагато краще знайти загальні підходи, які будуть працювати для всіх реалізацій інтерфейсу. Якщо ви не можете цього зробити, ви повинні дозволити можливість передачі об'єкта класу, який реалізує інтерфейс, але не є одним із класів, для яких у вас є спеціальний код справи. Якщо вам потрібен спеціальний код регістру для java.util.ArrayList, то чому б вам не потрібен спеціальний код справи для примірників приватного класу, який Arrays.asList використовує для його результату?

Коли проблема полягає у різних класах у вашому власному коді, ви часто можете перетворити проблему та помістити метод у те, що наразі є класом аргументів, так що звичайне переосмислення працює.