if(iOb.absEqual(10b))
В первом вызове переменная iOb указывает на объект типа NumericFns
class А { // ... }
class В extends А { // ... }
class С extends А { // ... }
// Обратите внимание на то, что D не является подклассом А. class D { // ... } Здесь класс А является суперклассом для классов В и С, но не для класса D. Теперь рассмотрим очень простой обобщенный класс.
// Простой обобщенный класс. class Gen { ^ Т ob; Gen(Т о) { ob = о; }
} В классе Gen предусмотрен один параметр типа, который определяет тип объекта, хранящегося в переменной ob. Как видите, на тип Т не накладывается никаких ограничения. Следовательно, параметр типа Т может обозначать любой класс. А теперь допустим, что требуется создать метод, принимающий аргумент любого типа, соответствующего объекту класса Gen, при условии, что в качестве параметра типа этого объекта указывается класс А или его подклассы. Иными словами, требуется создать метод, который оперирует только объектами типа Gen<тип>, где тип — это класс А или его подклассы. Для этой цели нужно воспользоваться ограниченным метасимволь- ным аргументом. Ниже для примера приведено объявление метода test , которому в качестве аргумента может быть передан только объект класса Gen, на параметр типа которого накладываются следующие ограничения: соответствие классу А или его подклассам.
// Здесь знак ? устанавливает соответствие // классу А или производным от него подклассам, static void test(Gen extends A> o) { // ... } А приведенный ниже пример класса демонстрирует типы объектов класса Gen, которые могут быть переданы методу test .
class UseBoundedWildcard {
// Здесь знак ? устанавливает соответствие
// классу А или производным от него подклассам.
//В объявлении этого метода используется ограниченный
// метасимвольный аргумент.
static void test(Gen extends A> о) {
// ...
}
public static void main(String args[]) {
A a = new A;
В b = new В ;
С с = new C;
D d = new D ;
Gen w = new Gen(a);
Gen w2 = new Gen(b);
Gen