1. Introduction

2. 메서드 오버로딩의 문제

public class CollectionClassifier {
    
    public static String classify(Set<?> set) {
        return "Set";
    }
    
    public static String classify(List<?> list) {
		    return "List";
    }
    
    public static String classify(Collection<?> collection) {
		    return "Other";
    }
    
    public static void main(String[] args) {
		    Collection<?> collections = {
				    new HashSet<String>(),
				    new ArrayList<BigInteger>(),
				    new HashMap<String, String>().values()
		    };
		    
		    for(Collection<?> c : collections) {
				    System.out.println(classify(c));
		    }
    }
}

이유

class Parent {

    public void print() {
        System.out.println("Parent");
    }
}

class Child extends Parent {

    @Override
    public void print() {
        System.out.println("Child");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent p = new Child();
        Parent p2 = new Parent();

        p2.print();
        p.print();
    }
}