2012-03-13 125 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方法。

有可能有更好的解决方案,但这一个将工作。