目录
父类或接口中的泛型可以被子类继承
继承泛型类和泛型接口
class ExtendClass<T>{
}
----->
class SubClass<T> extends ExtendClass<T>{
}
interface TestInterface<T>{
}
----->
class SubClass2<T> implements TestInterface<T>{
}
public class Demo {
public static void main(String[] args) {
}
}
class Father<T>{
T t;
public Father(T t) {
this.t=t;
}
}
interface TestInterface<E>{
}
class Child<T,E> extends Father<T> implements TestInterface<E>{
public Child(T t) {
super(t);
}
}
泛型继承的四种情况
父类--> abstract class Father<T1,T2>{}
1.全部继承
class Child<T1,T2,T2> extends Father<T1,T2>{}
public class Demo {
public static void main(String[] args) {
Father<Integer,String> f=new Child<>(1,"2");
//Child<Integer,String,Boolean> c=new Child<>(1,"2"); 此行会报错
Child<Integer,String,Boolean> c=new Child<>(1,true); //正确,不会报错(T1,T3继承)
}
}
class Father<T1,T2>{
T1 t1;
T2 t2;
public Father(T1 t1, T2 t2) {
this.t1 = t1;
this.t2 = t2;
System.out.println("t1的类型:"+this.t1.getClass());
System.out.println("t2的类型:"+this.t2.getClass());
}
}
/*class Child<T1,T2,T3>extends Father<T1,T2>{
public Child(T1 t1, T2 t2) {
super(t1, t2);
}
}*/
//T3继承
class Child<T1,T2,T3>extends Father<T1,T3>{
public Child(T1 t1, T3 t2) {
super(t1, t2);
}
}
//运行结果
t1的类型:class java.lang.Integer
t2的类型:class java.lang.String
t1的类型:class java.lang.Integer
t2的类型:class java.lang.Boolean
2,部分继承
calss Child<T1,A,B> extends Father<T1,String>{}
public class Demo {
public static void main(String[] args) {
Child<String,Byte,Boolean> c=new Child<>("1","2"); //第二三个泛型可以是任意类型,不影响
}
}
class Father<T1,T2>{
T1 t1;
T2 t2;
public Father(T1 t1, T2 t2) {
this.t1 = t1;
this.t2 = t2;
System.out.println("t1的类型:"+this.t1.getClass());
System.out.println("t2的类型:"+this.t2.getClass());
}
}
//T3继承
class Child<T1,T2,T3>extends Father<T1,String>{
public Child(T1 t1, String t2) {
super(t1, t2);
}
}
//运行结果
t1的类型:class java.lang.String
t2的类型:class java.lang.String
3.实现父类泛型
class Child<A,B> extends Father<Integer,String>{}
子类在继承父类的时候,将父类所有的泛型都实现了,这样子类就不会继承父类的泛型了,即使创建了泛型,也是子类独有的。
public class Demo {
public static void main(String[] args) {
//前面类型改变不影响结果
Child<Boolean,Boolean,Boolean> c=new Child<>(1,"2");
}
}
class Father<T1,T2>{
T1 t1;
T2 t2;
public Father(T1 t1, T2 t2) {
this.t1 = t1;
this.t2 = t2;
System.out.println("t1的类型:"+this.t1.getClass());
System.out.println("t2的类型:"+this.t2.getClass());
}
}
class Child<T1,T2,T3>extends Father<Integer,String>{//把所有泛型实现,子类再多的泛型与父类无关
public Child(Integer t1, String t2) {
super(t1, t2);
}
}
//运行结果
t1的类型:class java.lang.Integer
t2的类型:class java.lang.String
4.不实现父类泛型
class Child extends Father{}
忽略父类泛型,既不实现,也不继承;这样不会报错,但是父类所有泛型成员会默认为Object类型
public class Demo {
public static void main(String[] args) {
//前面类型改变不影响结果
Child<Boolean,Boolean,Boolean> c=new Child<>("1","2"); //写什么都可以
System.out.println("--");
Child<Boolean,Boolean,Boolean> d=new Child<>(1,"2");
}
}
class Father<T1,T2>{
T1 t1;
T2 t2;
public Father(T1 t1, T2 t2) {
this.t1 = t1;
this.t2 = t2;
System.out.println("t1的类型:"+this.t1.getClass());
System.out.println("t2的类型:"+this.t2.getClass());
}
}
class Child<T1,T2,T3>extends Father{
public Child(Object t1, Object t2) {
super(t1, t2);
// TODO 自动生成的构造函数存根
}
}
//运行结果
t1的类型:class java.lang.String
t2的类型:class java.lang.String
--
t1的类型:class java.lang.Integer
t2的类型:class java.lang.String