9.2.2 从泛型类派生子类
9.2.2 从泛型类派生子类
当创建了带泛型声明
的接口、父类之后,可以为该接口创建实现类,或从该父类派生子类,需要指出的是,当使用这些带泛型声明的接口、父类时不能再包含泛型形参
。例如,下面代码就是错误的。
1 | //定义类A继承Appe类, Apple类不能跟泛型形参 |
方法中的形参代表变量、常量、表达式等数据,本书把它们直接称为形参,或者称为数据形参。
定义方法时可以声明数据形参,调用方法(使用方法)时必须为这些数据形参传入实际的数据;
与此类似的是,定义类、接口、方法时可以声明泛型形参,使用类、接口、方法时应该为泛型形参传入实际的类型。
如果想从Apple
类派生一个子类,则可以改为如下代码:
1 | //使用 Apple类时为T形参传入String类型 |
调用方法时必须为所有的数据形参传入参数值,与调用方法不同的是,使用类、接口时也可以不为泛型形参传入实际的类型参数,即下面代码也是正确的。
1 | //使用 Apple类时,没有为T形参传入实际的类型参数 |
像这种使用Apple
类时省略泛型的形式被称为原始类型(raw type
)。
如果从Apple<String>
类派生子类,则在Apple
类中所有使用T
类型的地方都将被替换成String
类型,即它的子类将会继承到String getInfo()
和void setlnfo(String info)
两个方法,如果子类需要重写父类的方法,就必须注意这一点。下面程序示范了这一点。
1 | public class A1 extends Apple<String> { |
如果使用Apple
类时没有传入实际的类型(即使用原始类型),java
编译器可能发出警告:使用了未经检査或不安全的操作——这就是泛型检查的警告,读者在前一章中应该多次看到这样的警告。如果希望看到该警告提示的更详细信息,则可以通过为javac
命令增加-Xlint unchecked
选项来实现。此时,系统会把Apple<T
类里的T形参当成Object
类型处理。如下程序所示。
1 | public class A2 extends Apple |
上面程序都是从带泛型声明的父类来派生子类,创建带泛型声明的接口的实现类与此几乎完全一样,此处不再赘述。