2014-02-21 3 views
0

У меня есть абстрактный класс с интерфейсом делегирования определенным:Java дженерик статического типа вывод

public abstract class MyAbstractClass extends AsyncLoader { 

public interface MyAbstractClassDelegate<M> { 
    //The parameter in this method should be the concrete subtype of MyAbstractClass 
    public M performThisCall(MyAbstractClass concreteSubclassOfAbstractClass); 
} 

private MyAbstractClassLoaderDelegate delegate; 
    ... 
} 

Проблема в том, я не хочу, чтобы параметр делегата быть MyAbstractClass, вместо этого он должен быть конкретным подклассом. Зачем? Поскольку реализация делегата необходим конкретный подкласс для дальнейшей обработки, и я не хочу, чтобы бросить его ...

Я знаю, что я мог бы определить Interface в каждый подкласс, но это будет выглядеть так же в каждый подкласс для параметра типа

EDIT

Вот только идеальное решение решения именно то, что я хотел. Большое спасибо!

public abstract class MyAbstractClass { 

public interface MyAbstractClassDelegate<M, Subtype extends MyAbstractClass> { 
    public M myMethod(Subtype t); 

} 

}

Возможно ли это с Java 6 и если да - то как?

ответ

1

Мое решение будет:

public final class Example<T extends Example<T>> { 

    public interface Interface<M, Subtype extends Interface<M, Subtype>> { 
     public M myMethod(Subtype t); 

    } 
} 

У вас нет доступа к родовым от внешнего класса внутри интерфейса (поскольку интерфейс является статическим), поэтому вам придется объявить это снова.

Если вы используете интерфейс, который вы получите что-то вроде этого:

private static class Impl1 implements Interface<String, Impl1> { 

    @Override 
    public String myMethod(final Impl1 t) { 
    return null; 
    } 
} 

Я не знаю, если это поможет, но вот мой полный пример:

public final class Example<M, T extends Example.Delegate<M, T>> { 

    public interface Delegate<M, Subtype extends Delegate<M, Subtype>> { 
    public M myMethod(Subtype t); 
    } 

    private T delegate; 


    private static class Impl1 implements Delegate<String, Impl1> { 

     @Override 
     public String myMethod(final Impl1 t) { 
     return null; 
     } 

    } 

    public static void main(String[] args) { 
    Example<String, Impl1> example = new Example<>(); 
    example.delegate = new Impl1(); 
    example.delegate.myMethod(example.delegate); //works but whout? 
    } 
} 
+0

Идеально, с подтипом его работы, althoug Подтип расширяет MyAbstractClass - это то, что я хотел – Alexander

0

Что вы можете сделать, так это дать вашему абстрактному классу параметр типа с конкретным подклассом, аналогичным тому, как это делает Java Enum.

Что-то вдоль линий этого:

public abstract class MyAbstractClass<S extends MyAbstractClass<S>> extends AsyncLoader { 

    public interface MyAbstractClassDelegate<M, S> { 
     public M performThisCall(S concreteSubclassOfAbstractClass); 
    } 

... 
+0

Я попытался это уже , к сожалению, компилятор говорит «MyAbstractClass.this нельзя ссылаться из статического контекста» – Alexander

+1

@Alexander нет статического контекста в образцах и ваш вопрос, поэтому вы совершаете ошибку где-то в другом месте. –

+0

@Alexander Какой код дает это сообщение об ошибке? – Smallhacker

Смежные вопросы