怎么使用泛型参数中的方法
如何使用泛型参数中的方法
假设现在有两个类,student和teacher,并且这两个类没有实现共同的接口或者继承自同一个类,但是这两个类中都有getId()这个方法
我现在想写一个函数
public<T> int getId(T t)
使得可以通过getId(student1)和getId(teacher1)分别得到id,如何实现?
------解决思路----------------------
这其实就是说Student类和Teacher类都继承Object,因为Object是所有所有类的根嘛,当定义类时没extens就等同与extends Object,如果继承了某类,实际就是间接继承Object.
因此你要写的泛型类只能存Object,跟做泛型一样.因为你new 对象时<>里填啥呢?填<Student> Teacher进不去,填<Teacher> Students进不去.泛型限定的话只能填<? extends Object>那跟没泛型不是一样么? 所以不继承一个非Object类就实现一个接口吧. 否则就用instanceof 判断对象类型,强转后调用.
public<T> int getId(T t) {
int tmp;
if (t instanceof Students)
{Student st= (Students)t;
tmp= st.getId;}
}else if (t instanceof Teacher)
{Teacher th= (Teacher)t;
tmp= th.getId;}else
{System.out.println("错误类型传输");
throw new ClassCastException();}
return tmp;
}
不想抛异常就得选择一个不是id的值当错误码/
------解决思路----------------------
如果明确的知道一定有getId方法,有两种选择:
1 一定要用泛型的话,定义一个这两个类的超类A,里边只定义一个getId方法给子类重载,然后把泛型方法的泛型声明为T extends A,这样编译器认为T一定有getId方法就可以通过编译
2 我个人不建议用泛型,因为定义出来的超类不一定有逻辑意义。可以在getId方法中用反射调用参数的getId方法。
假设现在有两个类,student和teacher,并且这两个类没有实现共同的接口或者继承自同一个类,但是这两个类中都有getId()这个方法
我现在想写一个函数
public<T> int getId(T t)
使得可以通过getId(student1)和getId(teacher1)分别得到id,如何实现?
------解决思路----------------------
这其实就是说Student类和Teacher类都继承Object,因为Object是所有所有类的根嘛,当定义类时没extens就等同与extends Object,如果继承了某类,实际就是间接继承Object.
因此你要写的泛型类只能存Object,跟做泛型一样.因为你new 对象时<>里填啥呢?填<Student> Teacher进不去,填<Teacher> Students进不去.泛型限定的话只能填<? extends Object>那跟没泛型不是一样么? 所以不继承一个非Object类就实现一个接口吧. 否则就用instanceof 判断对象类型,强转后调用.
public<T> int getId(T t) {
int tmp;
if (t instanceof Students)
{Student st= (Students)t;
tmp= st.getId;}
}else if (t instanceof Teacher)
{Teacher th= (Teacher)t;
tmp= th.getId;}else
{System.out.println("错误类型传输");
throw new ClassCastException();}
return tmp;
}
不想抛异常就得选择一个不是id的值当错误码/
------解决思路----------------------
如果明确的知道一定有getId方法,有两种选择:
1 一定要用泛型的话,定义一个这两个类的超类A,里边只定义一个getId方法给子类重载,然后把泛型方法的泛型声明为T extends A,这样编译器认为T一定有getId方法就可以通过编译
2 我个人不建议用泛型,因为定义出来的超类不一定有逻辑意义。可以在getId方法中用反射调用参数的getId方法。
public int getId(Object t) {
Method m = t.getDeclaredMethod("getId",
new Class[] {});
int r = (int) m.invoke(t, new Object[] {});
return r;
}