2012-03-13 1 views
1
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) { 
     ... 
    } 
} 

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

+1

http://stackoverflow.com/questions/252055/java-generics-wildcards Не делает ли это что-то похожее на то, что вы хотите? –

+0

В вашем примере кода T является типом TimeSeries, поэтому вы не укажете тип SamplingOperator, просто TimeSeries. – Caps

+0

Ваш вопрос путается: интерфейс имеет метод 'operationOn', но подкласс имеет метод' sample', который переопределяет что-то. Вы хотите, чтобы весь подкласс или просто «образец» не зависел от типа? Возможно, SamplingOperator не должен быть реализацией UnivariateOperator. – toto2

ответ

-2
implements UnivariateOperator<Object> 
+0

Тогда он будет работать только с 'TimeSeries ', а 'TimeSeries ' не совместим с типом TimeSeries '. – Jeffrey

+0

Вы можете сделать это совместимым с чем угодно, если вы измените на

+1

Вы действительно пробовали? Вы не можете реализовать что-то с помощью шаблона. –

0

Вы не можете, поскольку вам необходимо указать общий вариант 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

Вы забыли свой тип возврата для вашего заводского метода. Кроме того, вы не можете «реализовать UnivariateOperator ', потому что вам не разрешено использовать подстановочный знак при указании супертипа. – Jeffrey

+0

Просто не используйте так. Во всяком случае, завод работает. Вам не нужно было отрицать ответ u.u –

+0

Ваш ответ неверный. Вы даже не можете составить свое первое предложение. Если вы отредактируете эту часть, я бы с радостью перевернул свой голос. – Jeffrey

0

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

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.

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