3 回答
TA贡献1784条经验 获得超2个赞
设计一个接口,让要调用这个函数的类都实现这个接口
interface IHaveTm {
void setIsTm(String isTm);
String getIsTm();
}
public void <T extends IHaveTm> updateIsTm(T t, ...) {
t.setIsTm(...)
}
补充:
如果不修改调用这个函数的类,做无侵入式设计的话,估计只能用反射了
public void updateIsTm(Object obj, ...) throws Exception {
Method m = obj.getClass().getDeclaredMethod("setIsTm", String.class);
if (m != null) {
m.invoke(obj, ...);
}
}
这样的话就得靠约定来保证调用的安全性了,不建议这么做
TA贡献1982条经验 获得超2个赞
public class Main {
public static void main(String[] args) {
setIsTm(new A(), "haha");
setIsTm(new B(), "haha again");
}
public static void setIsTm(TMSetable t, String var1) {
t.setIsTm(var1);
}
}
interface TMSetable {
public void setIsTm(String isTm);
}
class A implements TMSetable {
private String isTm;
/*
* @see io.beansoft.netty.netty4.bootstrap.TMSetable#setIsTm(java.lang.String)
*/
@Override
public void setIsTm(String isTm) {
this.isTm = isTm;
System.out.println("A is setting isTm=" + isTm);
}
}
class B implements TMSetable {
private String isTm;
/*
* @see io.beansoft.netty.netty4.bootstrap.TMSetable#setIsTm(java.lang.String)
*/
@Override
public void setIsTm(String isTm) {
this.isTm = isTm;
System.out.println("B is setting isTm=" + isTm);
}
}
输出结果:
A is setting isTm=haha
B is setting isTm=haha again
从题目来看,没看出有泛型设计的必要。
TA贡献1835条经验 获得超7个赞
从设计上来说,设计一个接口或抽象类将isTm这个属性抽象出来比较好。
但如果这些类你已经没办法去修改,而他们之间也没有继承或实现共同的父类或接口,那就只能用反射了。
但用反射的话,会让代码变得很不堪,出问题也不好找,用得不好属于埋雷行为。
添加回答
举报