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

와일드 카드를 사용할 수있는 방법이 있습니까? 그렇다면 샘플링 운영자는 어떤 유형에서도 작동 할 수 있습니까? 샘플링 연산자의 형식을 지정하지 않으려 고합니다 ... 모든 입력 된 timeseries와 함께 작동해야합니다.Java 제네릭 와일드 카드

+1

http://stackoverflow.com/questions/252055/java-generics-wildcards이 작업이 원하는 작업과 유사하지 않습니까? –

+0

코드 예제에서 T는 TimeSeries의 형식이므로 SamplingOperator 형식을 지정하지 않고 TimeSeries 만 지정할 수 있습니다. – Caps

+0

당신의 질문은 혼란 스럽습니다 : 인터페이스는'operateOn' 메쏘드를 가지고 있습니다 만, 서브 클래스는 무언가를 오버라이드하는'sample' 메쏘드를 가지고 있습니다. 전체 서브 클래스를 원하거나'sample'만이 타입에 독립적 이길 원합니까? 어쩌면 SamplingOperator가 UnivariateOperator를 구현해서는 안됩니다. – toto2

답변

-2
implements UnivariateOperator<Object> 
+0

그러면 'TimeSeries '에서만 작동하고'TimeSeries '는'TimeSeries '과 호환되지 않습니다. – Jeffrey

+0

+1

실제로 해 보셨습니까? 와일드 카드를 사용하여 무언가를 구현할 수는 없습니다. –

0

UnivariateOperator의 일반 사항을 지정해야하기 때문에 할 수 없습니다. 당신은 샘플 시계열, 당신은

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

+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의 인스턴스가 sample 방법에 대한 인수로 TimeSeries의 모든 유형을 수용 할 수 있음을 보장합니다.

더 나은 해결책이 있지만이 방법이 효과적입니다.