如何使用泛型参数中的方法

gdrocky1989 2015-09-20 02:45:26
假设现在有两个类,student和teacher,并且这两个类没有实现共同的接口或者继承自同一个类,但是这两个类中都有getId()这个方法
我现在想写一个函数
public<T> int getId(T t)
使得可以通过getId(student1)和getId(teacher1)分别得到id,如何实现?
...全文
467 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
冻结河 2015-09-23
  • 打赏
  • 举报
回复
反射正解
「已注销」 2015-09-22
  • 打赏
  • 举报
回复
用反射。。。。。。。。。。。。。。
bree06 2015-09-21
  • 打赏
  • 举报
回复
在Student 和 Teacher 中分别写getId()逻辑随便,非常复杂也OK,然后
public<T> int getId(T t) {
    return t.getId();
}
也可以直接用t.getId(),不要额外的getId()方法
gdrocky1989 2015-09-21
  • 打赏
  • 举报
回复
引用 2 楼 afei__ 的回复:
直接用方法的重载不就行了 getId(Student s)传入一个Student对象就调用学生的getId()方法 getId(Teacher t)传入一个Teacher对象就调用教室的getId()方法 你想用泛型只写一个方法的话就让他们都继承自一个类,泛型就是这个类,然后系统才会自动转型
我这只是举一个例子,getID有可能是一个有非常复杂逻辑的方法,如果写两个方法的话,除了参数不同,里面大块代码是相同的,这样就是坏代码 无法让他们都继承自一个类,因为这两个类不是我定义的,改不了
gdrocky1989 2015-09-21
  • 打赏
  • 举报
回复
引用 1 楼 coder101 的回复:
在需要getID的类里面,写俩方法不就行了。一个接受学生对象返回ID一个接受老师对象返回ID
我这只是举一个例子,getID有可能是一个有非常复杂逻辑的方法,如果写两个方法的话,除了参数不同,里面大块代码是相同的,这样就是坏代码
解开者 2015-09-21
  • 打赏
  • 举报
回复
如果明确的知道一定有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;
	}
wjxtju 2015-09-21
  • 打赏
  • 举报
回复
引用
假设现在有两个类,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的值当错误码/
阿飞__ 2015-09-20
  • 打赏
  • 举报
回复
直接用方法的重载不就行了 getId(Student s)传入一个Student对象就调用学生的getId()方法 getId(Teacher t)传入一个Teacher对象就调用教室的getId()方法 你想用泛型只写一个方法的话就让他们都继承自一个类,泛型就是这个类,然后系统才会自动转型
coder101 2015-09-20
  • 打赏
  • 举报
回复
在需要getID的类里面,写俩方法不就行了。一个接受学生对象返回ID一个接受老师对象返回ID

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧