[英]Pass type parameter to method of interface
有以下课程:
public abstract class AbstractWriter<T extends BE> {
protected final T be;
// Constructor, some methods
public static interface Setter {
void setNewValue();
}
protected <S> void setValue(final Class<S> clazz, final S oldValue,
final S newValue, final Setter setter) {
// Do something
setter.setNewValue();
// Do something
}
}
然后是PersonWriter
,它扩展了AbstractWriter
,当前看起来像这样:
public class PersonWriter extends AbstractWriter<BEPerson> {
public PersonWriter(BEPerson be) {
super(be);
}
public void setName(String oldValue, final String newValue) {
setValue(String.class, oldValue, newValue, new Setter() {
@Override
public void setNewValue() {
be.setName(newValue);
}
});
};
}
但我希望setName
看起来像这样:
public void setName(String oldValue, String newValue) {
setValue(String.class, oldValue, newValue, new Setter() {
@Override
public void setNewValue(String newValue) {
be.setName(newValue);
}
});
};
我必须如何修改AbstractWriter
才能使其正常工作(如果可能的话)?
您似乎要花相当长的时间才能在字段;-)上调用setter函数。 您想知道setValue
调用中的new Setter()
如何知道newValue
是String
以及何时是其他String
吗?
对于setter的类型参数,我认为应该不难:
public abstract class AbstractWriter<T extends BE> {
//...
public static interface Setter<S> {
void setNewValue(S newValue);
}
protected <S> void setValue(final Class<S> clazz, final S oldValue,
final S newValue, final Setter<S> setter) {
// Do something
setter.setNewValue(newValue);
// Do something
}
}
这是你想要的?
class BE {
}
class BEPerson extends BE {
void setName(String s) {}
void setAge(Integer i) {}
}
public abstract class AbstractWriter<T extends BE> {
protected final T be;
// Constructor, some methods
AbstractWriter(T be) { this.be = be; }
public static interface Setter<S> {
void setNewValue(S v);
}
protected <S> void setValue(final Class<S> clazz, final S oldValue,
final S newValue, final Setter setter) {
// Do something
setter.setNewValue(newValue);
// Do something
}
}
class PersonWriter extends AbstractWriter<BEPerson> {
public PersonWriter(BEPerson be) {
super(be);
}
public void setName(String oldValue, final String newValue) {
setValue(String.class, oldValue, newValue, new Setter<String>() {
@Override
public void setNewValue(String newValue) {
be.setName(newValue);
}
});
};
public void setAge(Integer oldValue, final Integer newValue) {
setValue(Integer.class, oldValue, newValue, new Setter<Integer>() {
@Override
public void setNewValue(Integer newValue) {
be.setAge(newValue);
}
});
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.