2017-02-08 10 views
-1

Видя, что B является подклассом A, почему я могу добавить элемент типа B в список из метода print(), но не передать список типа B этому же методу?Путаница о дженериках в java

public class Test { 

    private static void print(List<A> list) { 
     list.add(new B()); 
    } 

    public static void main(String[] args) { 
     List<B> list = new ArrayList<>(); 
     list.add(new B()); 
     print(list); //does not compile 
    } 
} 

class A {} 

class B extends A {} 

class C extends B {} 

ответ

0

Обычно эмпирическое правило заключается в том, чтобы использовать ваш класс ужина для объявления переменных. вам нужно иметь свой список, как A затем заполнить его с B класса

public static void main(String[] args) { 
    List<A> list = new ArrayList<A>(); 
    list.add(new B()); 
    print(list); 
} 

Примечание:

Вы можете рассмотреть класс ребенка как момент высшего класса, но не наоборот

в вашем случае, так как печать принимает List<A> в качестве параметра, то вы можете отправить List<A> не List<B>. Однако List<A> может содержать экземпляры B.

+0

Но вы могли бы объявить 'void print (List )', и это сработает. –

+0

@ AndyTurner, да, вы могли бы это сделать. но тогда это может усложниться, если вы хотите использовать экземпляр 'C'. конечно, предполагая, что он не предназначен (т. е. изолирует B) – nafas