Java 将类型参数传递给接口的方法

Java 将类型参数传递给接口的方法,java,generics,interface,anonymous-class,Java,Generics,Interface,Anonymous Class,下面是一节课: 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&l

下面是一节课:

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
    }       
}
但是我希望
setName
看起来像这样:

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);
            }
        });
    };
}
    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
调用中的
newsetter()
是如何知道
newValue
何时为
字符串,何时为其他内容的

使用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
    }    
}   
公共抽象类AbstractWriter{
//...
公共静态接口设置器{
void setNewValue(S newValue);
}
受保护的无效设置值(最终类别类别类别、最终S旧值、,
最终设定值(新值,最终设定值设定值设定值){
//做点什么
setter.setNewValue(newValue);
//做点什么
}    
}   

这就是你要找的吗

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);
            }
        });
    };
}
BE类{
}
类BeBeBe{
void setName(字符串s){}
无效设置(整数i){}
}
公共抽象类AbstractWriter{
最终不受保护;
//构造函数,一些方法
抽象作者(T be){this.be=be;}
公共静态接口设置器{
无效设置新值(S v);
}
受保护的无效设置值(最终类别类别类别、最终S旧值、,
最终设定值(新值,最终设定值设定值设定值){
//做点什么
setter.setNewValue(newValue);
//做点什么
}       
}
类PersonWriter扩展了AbstractWriter{
公共撰稿人(BEPerson be){
超级(be);
}
public void setName(字符串oldValue,最终字符串newValue){
setValue(String.class、oldValue、newValue、newsetter(){
@凌驾
公共void setNewValue(字符串newValue){
be.setName(newValue);
}
});
};
公共无效设置(整型旧值,最终整型新值){
setValue(Integer.class、oldValue、newValue、newsetter(){
@凌驾
public void setNewValue(整数newValue){
be.设置(新值);
}
});
};
}

我首先在
setNewValue
方法中使用类型参数进行了尝试,但没有成功。