package quickml.supervised.crossValidation; import quickml.data.instances.ClassifierInstance; import quickml.data.instances.Instance; import quickml.supervised.PredictiveModel; import quickml.supervised.classifier.logisticRegression.LogisticRegression; import quickml.supervised.classifier.logisticRegression.SparseClassifierInstance; import java.util.List; /** * Created by alexanderhawk on 11/11/15. */ public class InterfacesCompilationTest { public interface CopyableData<R extends Instance, T extends Transformed<R>> { T copyWithJustTrainingSet(List<R> trainingSet); } public interface Transformed<R extends Instance> { public abstract List<R> getTransformedInstances(); } public interface TransformedData<R extends Instance, D extends TransformedData<R, D>> {//extends Transformed<R>, CopyableData<R, D> { D copyWithJustTrainingSet(List<R> trainingSet); public abstract List<R> getTransformedInstances(); // public TransformedData() { // super(); // } } //what is the problem? copy needs to return the dynamic type of the object, and right now it returns // a TransformedDataWithDates<I, D>. What can i do differently? Move where copy is being called...no a TransformededData object needs to be copyable //could reduce the type constraints on D with the documentation saying what it should be. But this means i can't do meta programming later, on presumed methods. //Note in python...can't write generic methods with the assumption that certain objects will have methods? or can we. Can't do it safely. public interface TransformedDataWithDates<I extends Instance, D extends TransformedDataWithDates<I, D>> extends TransformedData<I, D> { // public TransformedDataWithDates() { // super(); // } public abstract void getDateTimeExtractor(); } //what type of D is inherited? public static abstract class LogisticRegressionDTO<D extends LogisticRegressionDTO<D>> implements TransformedDataWithDates<SparseClassifierInstance, D> { } public static class MeanNormalizedAndDatedLogisticRegressionDTO extends LogisticRegressionDTO<MeanNormalizedAndDatedLogisticRegressionDTO> { @Override public void getDateTimeExtractor() { } @Override public MeanNormalizedAndDatedLogisticRegressionDTO copyWithJustTrainingSet(final List<SparseClassifierInstance> trainingSet) { return null; } @Override public List<SparseClassifierInstance> getTransformedInstances() { return null; } } ///gen datatransformers public interface DataTransformer<I extends Instance, R extends Instance, D extends TransformedData<R, D>> {//TransformedData<R, D>> { void transformData(List<I> rawInstance, D data); } public static class DatedAndMeanNormalizedLogisticRegressionDataTransformer implements DataTransformer<ClassifierInstance, SparseClassifierInstance, MeanNormalizedAndDatedLogisticRegressionDTO> { @Override public void transformData(final List<ClassifierInstance> rawInstance, final MeanNormalizedAndDatedLogisticRegressionDTO data) { } } //model builders public interface EnhancedPredictiveModelBuilder<P extends PredictiveModel, I extends Instance, R extends Instance, D extends TransformedData<R, D>> extends DataTransformer<I, R, D> { P buildPredictiveModel(D transformedData); } public static class LogisticRegressionBuilder<D extends LogisticRegressionDTO<D>> implements EnhancedPredictiveModelBuilder<LogisticRegression, ClassifierInstance, SparseClassifierInstance, D> { @Override public LogisticRegression buildPredictiveModel(final D transformedData) { return null; } @Override public void transformData(final List<ClassifierInstance> rawInstance, final D data) { } } public static void main(String[] args) { LogisticRegressionBuilder<MeanNormalizedAndDatedLogisticRegressionDTO> logisticRegressionBuilder = new LogisticRegressionBuilder<MeanNormalizedAndDatedLogisticRegressionDTO>(); } //ok, so what is the problem now. The methods are not able to use the generics. //options: i can change the interface of EnhancedPredictiveModelBuilder. Or, I can make TransformedDataWithDates do something else in it's interface...i.e. i can make it implement copyable of a different generic type. }