1.使用泛型的时候发现和泛型同名的类的引用找不到对应的属性值
看上面的问题描述就可以清晰的发现问题了,因为在类上泛型定义了泛型,然后泛型的名字和要使用的类的对象一致,那么这个时候编译器会认为你这个地方是一个泛型,而不是你要使用的类,对于你这个泛型来说,自然是没有对应的属性的,只有Object类对象的方法。
public class Employee {
public String name;
public float money;
public int age;
public Employee(String name, float money, int age) {
this.name = name;
this.money = money;
this.age = age;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", money=" + money +
", age=" + age +
'}';
}
public void test(){
}
}
public interface MyInterface<T> {
public boolean compare(T t );
}
public class CompareMoney<Employee> implements MyInterface<Employee>{
@Override
public boolean compare(Employee employee) {
return false;
}
}
2.代码修改
要实现的功能其实是指定父类中的泛型是要使用的Employee类,上面的代码在CompareMoney<Employee>也加上了泛型,这个写法等同于public class CompareMoney<T> implements MyInterface<T>,但是因为public class CompareMoney<Employee> implements MyInterface<Employee>的泛型名字写的是Employee类名,会把要使用的Employee类认为是泛型。
public class CompareMoney<T> implements MyInterface<T>{
@Override
public boolean compare(T t) {
return false;
}
}
正确的使用方法,此时子类不具备泛型,因为已经规定了泛型的类型是Employee。
public class CompareMoney implements MyInterface<Employee>{
@Override
public boolean compare(Employee e ){
return false;
}
}
3.总结反思
对泛型的使用理念不理解,对泛型的使用不熟悉,盲目的使用泛型,这个地方的接口使用泛型的原因是可以根据子类的实现接口时候指定一个类型,从而达到保持compare方法中的参数和指定的类型一致。
泛型的产生:定义类、属性、方法的时候不确定到底会用到什么类型,所以不确定的地方用泛型来表示。
泛型的作用:规定集合中所添加的数据结构的类型;在自定义类、接口的泛型时,可以方便子类实现不同类型的接口和父类,增加了扩展性。

1043

被折叠的 条评论
为什么被折叠?



