2012-03-13 99 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泛型通配符

+1

http://stackoverflow.com/questions/252055/java-generics-wildcards這是不是做了類似於你想要的東西? – 2012-03-13 23:32:49

+0

在您的代碼示例中,T是TimeSeries的類型,因此您不會指定SamplingOperator的類型,而只是TimeSeries。 – Caps 2012-03-13 23:38:50

+0

你的問題令人困惑:接口有一個'operateOn'方法,但是子類有一個'sample'方法,它覆蓋了一些東西。你想要整個子類還是'sample'獨立於類型?也許SamplingOperator不應該是UnivariateOperator的實現。 – toto2 2012-03-14 00:46:59

回答

-2
implements UnivariateOperator<Object> 
+0

然後它只能和'TimeSeries '一起使用,'TimeSeries '與TimeSeries 類型不兼容。 – Jeffrey 2012-03-13 23:41:08

+0

如果將更改爲<?,則可以將其與任何內容兼容。擴展對象> – 2012-03-13 23:45:52

+1

你真的試過了嗎?你不能用通配符來實現某些東西。 – 2012-03-14 00:00:43

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 <?擴展Object>'因爲在指定超類型時不允許使用通配符。 – Jeffrey 2012-03-13 23:43:34

+0

只是不要以這種方式使用。無論如何,工廠工作。你不需要否定答案u.u – 2012-03-14 19:13:34

+0

你的回答是錯誤的。你甚至不能編譯你的第一個建議。如果你編輯了這部分,我很樂意翻動我的投票。 – Jeffrey 2012-03-14 21:08:34

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方法。

有可能有更好的解決方案,但這一個將工作。