2016-10-11 3 views
1

Я знаю, что перегрузкой это то, что решается во время компиляции, но когда я пытаюсь запустить пример ниже его дает мне результат, который я не могу понятьКоллекция перегрузки для различных типов коллекций

package miscellaneous; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

public class CollectionsOverloading { 

public static String classify(Set<?> s) { 
    return "Set"; 
} 

public static String classify(List<?> s) { 
    return "List"; 
} 

public static String classify(Collection<?> s) { 
    return "Collection"; 
} 

public static void main (String args[]) { 

    Collection<?>[] collections = { new HashSet<String>(), new ArrayList<String>(), new HashMap<String, String>().values()}; 

    for (Collection<?> coll : collections) { 
     System.out.println(classify(coll)); 
    } 
    } 
} 

Когда я запускайте этот фрагмент кода каждый раз, я получаю вывод как «Коллекция», что означает, что вызывается метод классификации с аргументом как Collection.

Пожалуйста, объясните

ответ

3

Поскольку метод classify, который вы вызываете, является статическим, вы выбираете, какой вызов вызывать во время компиляции, а не во время выполнения.

Во время компиляции, компилятор видит, что collections является массивом Collection, и, следовательно, связывается с версией classifypublic static String classify(Collection<?> s).

Edit: даже если эти методы были не статическую, вы бы еще найти версию Collection называют, так как overloaded methods are bonded using static binding at compile-time while overridden methods are bonded using dynamic binding at runtime.

1

Как уже говорилось, связывающая перегруженности методов производится во время компиляции. Когда вы перебираете список Collection, компилятор знает, что текущий элемент является экземпляром Collection, поэтому он ссылается на метод classify(Collection), который всегда вызывается.

0

becaluse Coll является тип коллекции, поэтому каждый раз, когда вызов классифицировать (Collection s) methed.if вы хотите позвонить другой Methed, вам нужно преобразовать type.Here это код:

Collection<?>[] collections = { new HashSet<String>(),new ArrayList<String>(), new HashMap<String, String>().values() }; 
for (Collection<?> coll : collections) { 
    if(coll instanceof Set<?>){ 
     System.out.println(classify((Set<?>)coll)); 
    } 
    else if(coll instanceof List<?>) { 
     System.out.println(classify((List<?>)coll)); 
    } 
    else { 
     System.out.println(classify((Collection<?>)coll)); 
    } 
}