2012-01-15 10 views
44

を実装ジェネリッククラス、私はいくつかのクラスを拡張し、インタフェースを実装するコンストラクタに(ジェネリッククラスを使用して)、パラメータを送信したい、例えばクラスを拡張し、クラスのdependeceを減らすためにインターフェース

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()をコンテキストとして使用して、ビューを作成したいと考えています。

+0

詳細情報を提供できますか? Javaのリフレクションを使用すると、 'Class'オブジェクトをメソッドに渡し、' getInterfaces() 'を介して実装されたインタフェースを検査したり、新しいインスタンスを作るために' Constructor'を取得/呼び出しすることができます。しかし、あなたの特定のユースケースは不明です。したがって、あなたの特定の問題を解決するためにこれらのアイテムをどのようにまとめていくかを理解することは難しいです。 – Devunwired

+0

@Devunwired、更新された私の質問 –

答えて

106

Tは次のようにSomeClassを宣言することができ、その場合にはSomeInterface

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

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

私は、Androidで不慣れなんだけど、getActivity()Fragmentで宣言されたパブリックインスタンスメソッドであるならば、コンパイラはそのメソッドを継承する必要があり、すべてのTのを知っているので、Tのインスタンス上でそれを呼び出すことが完全に可能になります。

+0

+1私にそれを打つ。 – Devunwired

+0

Mockitoを使用してT型のモッククラスを作成するにはどうすればよいですか? –

+1

@bwicks良い質問です。私はあなたのテストクラスが '抽象クラスTestFragment extends Fragment SomeInterface'のような型を宣言し、その型を' TestFragment.class'でモックする必要があると思われます。 –

6

このような操作をしますか?

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を実装する必要があることを指定します。タイプTのオブジェクトを必要とする

public class SomeClass<T extends Fragment & SomeInterface> 

は両方Fragmentを延長すると:

+0

私の質問が更新されました。 –

4

Fragmentを拡張していて、インターフェイスを実装しているT型を修正するのは簡単です。そういうものを書かなければなりません。

abstract class TemplateFragment extends Fragment implements SomeInterface{} 

、その後、あなたのクラスで

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

それはトリックを行います。

関連する問題