Шаблоны подстановки Java - PullRequest
       40

Шаблоны подстановки Java

1 голос
/ 14 марта 2012
public interface UnivariateOperator<T> {
    public TimeSeries<T> operateOn(TimeSeries<T> timeseries);
}

public class SamplingOperator<T> implements UnivariateOperator<T>  {    
    @Override
    public TimeSeries<T> sample(TimeSeries<T> timeseries) {
        ...
    }
}

Есть ли способ использовать подстановочные знаки, чтобы оператор выборки мог работать с любым типом? Я действительно не хочу указывать тип для оператора выборки ... он должен работать с любыми типизированными временными сериями.

Ответы [ 3 ]

0 голосов
/ 14 марта 2012

Вы не можете, потому что вам нужно указать универсальный UnivariateOperator.Если вам просто нужен универсальный метод, который выбирает TimeSeries, вам понадобится что-то вроде

public class TimeSeriesSampler {
    public static <T> TimeSeries<T> sample(TimeSeries<T> timeseries) {
        ...
    }
}

, но если вы хотите, чтобы SamplingOperator реализовал UnivariantOperator, вам нужно будет указать универсальный.Если вы все еще не хотите указывать, вы можете использовать что-то как

public class SamplingOperator implements UnivariateOperatior<Object> {
    private SamplingOperator(){
    }
    public <T> TimeSeries<T> sample(TimeSeries<T> timeseries) {
        return null;
    }
    @Override
    public TimeSeries<Object> operateOn(TimeSeries<Object> timeseries) {
        ...
    }
 }

, но вы потеряете силу универсального.Другой способ -

public class SamplingOperator<S> implements UnivariateOperatior<S> {
    private SamplingOperator(){
    }
    public <T> TimeSeries<T> sample(TimeSeries<T> timeseries) {
        return null;
    }
    @Override
    public TimeSeries<S> operateOn(TimeSeries<S> timeseries) {
        return timeseries;
    }
}

, но он "пахнет" плохо, так как образец метода дает ощущение метода класса, а не экземпляра.Это ваш выбор, что лучше всего сделать.

0 голосов
/ 14 марта 2012

Что делать, если вы сделали что-то вроде этого:

public class SamplingOperator<T> implements UnivariateOperator<T>  {   
    private SamplingOperator(){
    }

    @Override
    public TimeSeries<T> sample(TimeSeries<T> timeseries) {
        ...
    }

    public static SamplingOperator<? extends Object> getInstance() {
        return new SamplingOperator<Object>();
    }
}

Это гарантирует, что любой экземпляр SamplingOperator сможет принять любой тип TimeSeries в качестве аргумента своего метода sample.

Возможно, есть лучшие решения, но это будет работать.

0 голосов
/ 14 марта 2012
implements UnivariateOperator<Object>
...