web-dev-qa-db-ja.com

クラスを拡張し、インターフェイスを実装する汎用クラス

クラスの依存を減らすために、いくつかのクラスを拡張し、インターフェースを実装するコンストラクターにパラメーターを送信します(ジェネリッククラスを使用)。

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()を使用してビューを作成します。

54
Dmitry Zaytsev

Tはフラグメントを拡張し、SomeInterfaceを実装する必要があります

その場合、SomeClassを次のように宣言できます。

_public class SomeClass<T extends Fragment & SomeInterface>
_

それには、T型を拡張し、Fragmentを実装するためにSomeInterface型のオブジェクトが必要です。

さらに、Tクラスを使用して、コンテキストとしてT.getActivity()を使用してビューを作成します。

私はAndroidに不慣れですが、getActivity()Fragmentで宣言されたパブリックインスタンスメソッドである場合、Tのインスタンスで呼び出すことができます。コンパイラは、すべてのTsがそのメソッドを継承する必要があることを認識します。

121
Paul Bellora

このようなことをしたいですか?

class SomeClass {}

interface SomeInterface{
    public void someMethod();
}

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

これは許可されています。

しかし、Androidあなたの質問に固有のものは何ですか?私は何かが足りないと思うので、さらに詳細を提供できますか?

以下を更新

私はあなたが何をしたいのかまだ完全にはわかりませんし、依存関係をすぐに心配する必要があるかもわかりませんが、これは合法でもあります bounded type parameters

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();
    }
}

型パラメーター<T extends Fragment & SomeInterface>は、TFragmentのサブクラスであり、SomeInterfaceを実装することを指定します。

6
michiakig

Fragmentを拡張し、インターフェイスを実装しているタイプTを持つように修正すると理解していただければ簡単です。だから、あなたはそのような何かを書かなければなりません。

abstract class TemplateFragment extends Fragment implements SomeInterface{}

そして、あなたのクラスで

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

トリックを行います。

4
Orest