Подтвердить что ты не робот

Общий класс, расширяющий класс и реализующий интерфейс

Чтобы уменьшить зависимость от класса, я хочу отправить параметр (используя общий класс) в конструктор, который расширяет некоторый класс и реализует интерфейс, например

public interface SomeInterface{
    public void someMethod();
}

public class MyFragment extends Fragment implements SomeInterface{
    //implementation
}

//here is classs, that I need to create. T must extend Fragment and implements 
//SomeInterface. But, I'm afraid, if I'll use MyFragment directly, it will create a
//dependence of SomeClass from MyFragment.

public class SomeClass /*generic?*/ {
    public SomeClass(T parent);
}

Возможно ли это?

Теперь, используя мой класс T, я хочу создавать представления, используя T.getActivity() в качестве контекста.

4b9b3361

Ответ 1

T должен расширить фрагмент и реализовать SomeInterface

В этом случае вы можете объявить SomeClass следующим образом:

public class SomeClass<T extends Fragment & SomeInterface>

Для этого требуется объект типа T для расширения Fragment и реализации SomeInterface.

Кроме того, используя мой класс T, я хочу создавать представления, используя T.getActivity() в качестве контекста.

Я не знаком с Android, но если getActivity() - это метод открытого экземпляра, объявленный в Fragment, тогда вполне возможно вызвать его в экземпляре T, так как компилятор будет знать все T должен наследовать этот метод.

Ответ 2

Вы хотите сделать что-то вроде этого?

class SomeClass {}

interface SomeInterface{
    public void someMethod();
}

class AGenericClass<T> extends SomeClass implements SomeInterface {
    public void someMethod() {}
}

Это разрешено.

Но какой Android специфичен для вашего вопроса? Я думаю, что я должен что-то упустить, поэтому вы можете предоставить более подробную информацию?

обновление ниже

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

interface SomeInterface{
    public void someMethod();
}

class Fragment {
    public void aMethodInFragment() { }
}

public class SomeClass <T extends Fragment & SomeInterface> {
    public SomeClass(T parent) {
        parent.someMethod();
        parent.aMethodInFragment();
    }
}

Параметр type <T extends Fragment & SomeInterface> указывает, что T должен быть подклассом Fragment и реализовать SomeInterface.

Ответ 3

Легко, если я понимаю, что вы исправили, что у вас есть тип T, который расширяет фрагмент и реализует некоторый интерфейс. Поэтому вам нужно написать что-то подобное.

abstract class TemplateFragment extends Fragment implements SomeInterface{}

а затем в ваших классах

class SomeClass<T extends TemplateFragment> {
...
}

Он выполнит трюк.

Ответ 4

Для Kotlin вы можете использовать такой синтаксис:

class MyClass<T> where T: AnotherClass, T: SomeInterface