繁体   English   中英

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

[英]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()如何知道newValueString以及何时是其他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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM