2012-02-15 6 views
2

Там в следующий класс:Pass параметр типа для метода интерфейса

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, чтобы он работал (если это возможно)?

ответ

1

Вы, кажется, довольно длинный путь, чтобы вызвать функцию сеттера на поле ;-). Как выглядит new Setter() в вызове setValue, который вы хотите знать, когда newValue является String и когда это что-то еще?

С параметром типа для сеттера, я думаю, что это не должно быть трудно:

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 
    }  
} 
+0

Я попытался сначала с параметром типа в методе 'setNewValue', но это не сработало. –

0

Это то, что вы ищете?

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); 
      } 
     }); 
    }; 
} 
Смежные вопросы