Этот вопрос относится к моему предыдущему сообщению в here.. Прежде чем я опубликую свой вопрос, я вставляю содержимое из oracle docs;Как стирание ручек переопределяет сценарии в Java?
8.4.8.1. Overriding (by Instance Methods)
An instance method m1, declared in class C, overrides another instance method m2, declared in class A iff all of the following are true:
C is a subclass of A.
The signature of m1 is a subsignature (§8.4.2) of the signature of m2.
8.4.2. Method Signature
The signature of a method m1 is a subsignature of the signature of a method m2 if either:
m2 has the same signature as m1, or
the signature of m1 is the same as the erasure (§4.6) of the signature of m2.
Мое понимание type erasure
когда overriding
участвует выглядит следующим образом: если после erasure
, то signature of m1 and m2
такие же, то тогда они считаются overridden
. так в моем предыдущем посте выше я попытался override
parent class method
, который принимает List<String>
по subclass method
, который принимает List<Integer>
предполагая после type erasure
, что осталось только List<Object>
. но это неправильно. поэтому мое понимание вышеуказанного определения метода overriding
, когда вовлечено erasure
, является абсолютно неправильным. может кто-нибудь дать простой пример , чтобы объяснить вышеприведенную точку.
Спасибо. btw приведенные выше пункты взяты из here.
как насчет использования foo (List Extends Number>) в родительском классе и foo (список) в подклассе ... это недопустимо, но почему это так? Кстати, ваше объяснение велико. –
Если метод родительского класса имеет «Список extends Number> ', то он должен иметь возможность принимать' List 'в качестве аргумента. Если дочерний класс имеет «Список », он не может принять «Список » в качестве аргумента. Но чтобы переопределить, он должен принимать те же самые вещи, которые принимает переопределенный метод. Детский метод даже не может иметь параметр «Список », потому что это запретит «Список » в качестве аргумента, который будет принимать суперкласс. Таким образом, подпись переопределяющего метода не может быть 'List ' или 'List '; он должен соответствовать ('List extends Number>'). –
rgettman
Родительский класс может принимать 'Number' или что-нибудь, что' extends Number', такое как 'Double, Integer' и т. Д. Правильно? Детский класс не может 'override' с' List как параметр', и это просто потому, что 'Списки' являются' инвариантными' правильными ?? –