Ковариантного типы возвращение
Вы не можете иметь два метода в том же классе с подписями, которые отличаются только типом возвращаемого значения. До J2SE 5.0 релиза, верно также и то, что класс не может переопределить тип возвращаемого методы, которые он наследует от суперкласса. В этом совете вы узнаете о новой функции в J2SE 5.0, что позволяет ковариантной типы возвращения. Что это означает, что метод в подклассе может вернуть объект, тип которого является подклассом тип, возвращаемый методом с той же подписью в суперкласса. Эта функция устраняет необходимость в чрезмерной проверку типа и литья.
Давайте начнем со следующего класса, ConfusedClass. Класс пытается объявить два метода с той же подписью. Один из методов возвращает JTextField, а другая возвращается JPasswordField.
|
Если попытаться обобщить ConfusedClass, вы получите следующую ошибку компиляции:
ConfusedClass.java:10: getTextField() is already defined in
ConfusedClass
public JPasswordField getTextField(){
^
1 error
Глядя на эту ситуацию с точки зрения класса призыв getTextField (), вы можете увидеть причину ошибки компиляции. Как бы вы указать, какой из двух методов, вы ориентируетесь? Возьмем, к примеру, этот фрагмент:
|
Поскольку JPasswordField распространяется JTextField, либо вариант метода может правильно назвать.
Далее, создайте два класса, каждый из которых с различными версиями getTextField () методы. Эти два метода различаются по осуществлению и тип возвращаемого значения. Начните с следующие основания:
|
Обобщение ConfusedSuperClass. Вы увидите, что он компилирует без ошибок. Теперь создайте производный класс, который распространяется ConfusedSuperClass. Производный класс попытки вернуть экземпляр JPasswordField вместо JTextField возвращается getTextField () в ConfusedSuperClass.
|
Если вы используете версию JDK до J2SE 5.0, ConfusedSubClass не будет компилироваться. Вы увидите сообщение об ошибке, подобное следующему.
ConfusedSubClass.java:5: getTextField() in ConfusedSubClass
cannot override getTextField() in ConfusedSuperClass;
attempting to use incompatible return type
found : javax.swing.JPasswordField
required: javax.swing.JTextField
public JPasswordField getTextField(){
^
1 error
Ошибка сообщили, что вы пытаетесь использовать несовместимые тип возвращения. В самом деле, JPasswordField вы пытаетесь вернуть является подтипом JTextField. Этот же код компилируется, правильно под J2SE 5.0. Теперь разрешается отменять тип возвращаемого методом с подтипом первоначального типа. В текущем примере getTextField () в ConfusedSuperClass возвращает экземпляр типа JTextField. GetTextField () в ConfusedSubClass возвращает экземпляр типа JPasswordField.
Вы можете воспользоваться этими двумя классами с NotConfusedClient следующий класс. Этот класс создает экземпляр типа ConfusedSuperClass и типа ConfusedSubClass. Затем она вызывает getTextField () на каждом экземпляре, и отображает соответствующий тип объекта, возвращенного методом.
|
Обобщение и запустить NotConfusedClient. Когда вы запустите ее, вы должны увидеть следующий вывод:
===== Super Class ===== Called in class ConfusedSuperClass Got back an instance of class javax.swing.JTextField ===== Sub Class ===== Called in class ConfusedSubClass Got back an instance of class javax.swing.JPasswordField
В самом деле, вы получите тот же результат, если вы меняете тип возврата getTextField (), чтобы JTextField в ConfusedSubClass. Выигрыш происходит при использовании объектов, которые возвращаются при обращении к getTextField (). Перед J2SE 5.0, Вам необходимо опустив воспользоваться методами, которые присутствуют в производный класс, но не в базовом классе. Как вы видели, в J2SE 5.0 ConfusedSubClass компилирует с различным типом возврата, указанного для getTextField (), чем в настоящее суперкласса. Теперь вы можете использовать ваш тип ковариантной вернуться к вызвать метод, который доступен только в подтипа. Во-первых, изменили супертип следующим образом:
|
Добавить эксклюзивный метод соответствующего подкласса, а также изменить тип возвращаемого getAnObject () метод:
|
Обобщение суперкласс и подкласс, затем запустите SubClass. Вы должны увидеть следующее сообщение:
===== Call Exclusive method ===== Exclusive in Subclass.
Основной () метод создает экземпляр подкласса. Затем она вызывает getAnObject (). Из этого следует, это с призывом exclusiveMethod () на возвращен объект типа SubClass. Если тип возврата getAnObject () была SuperClass в SubClass.java, код не будет скомпилирован.
Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.