public static void main(String[] args) {
GenericInterface gi = new InterfaceImplOne();
//String str = gi.serve("######"); 代码错误,方法返回值为Object,不是子类写的String
Object o = gi.serve("######");//正确
GenericInterface<Integer> gi1 = new InterfaceImplTwo<Integer>();
Integer g1 = gi1.serve(123);//正确,
/**
* 为什么第一种使用父类引用返回的是Object类型,
* 而第二种却是子类定义的类型。
*/
}
/**
* 泛型接口
* 语法:接口名<T>
* 注意:不能泛型变量,因为变量默认为public static final,为静态变量
* 静态变量不能属于泛型类型
* @param <T>
*/
public interface GenericInterface<T> {
String name = "张三";
T serve(T t);
}
/**
* 普通实现类在实现接口时就需要指定泛型类型
*/
public class InterfaceImplOne implements GenericInterface<String>{
@Override
public String serve(String s) {
System.out.println(s);
return s;
}
}
/**
* 如果是泛型实现类,在实现接口就不需要指定泛型类型
*/
class InterfaceImplTwo<E> implements GenericInterface<E>{
@Override
public E serve(E e) {
System.out.println(e);
return e;
}
}
虽然One子类定义泛型为String,但创建父类时并没有定义父类泛型,所以调用父类方法返回的是最上层Object类型
没有创建父类,我是一个父类引用地址指向子类实例,方法的调用也是从方法区里的类模板指向我在堆里创建的子类实例对象,但你的回答也给我了我一个提示,也许返回值取决于类模板里定义的方法声明,谢谢哈。
是网址上最后一个类型通配符案例吗?那个和我写的InterfaceImplTwo<E>类效果一样的,自己指定的话就是具体的类,没指定就是Object类。我主要疑惑的点是我写的第一个InterfaceImplOne implements GenericInterface<String>是已经指定了String类型,使用父类引用调用子类重写的方法返回的不应该是我重写定义的String类型吗,它返回的却是Object类。
@嬉嘘aʊ: Thanks♪(・ω・)ノ