2

私はインターフェースを持っています:

public interface ILoginResult<T> {
    public T get();
}

私はLoginPageオブジェクトを持っています:

public class LoginPage<T> {

     ...

     public ILoginResult<T> login(...) {
          ...
     }

}

ランディング ページ オブジェクトもいくつかありますlogin。それらはインターフェースを実装します:

public class Page1 extends PageBase implements ILoginResult<Page1> {

     ...

}

loginこれらは、メソッドが返さなければならない種類のオブジェクトです。返されるオブジェクトのタイプは、 のLoginPage作成時に指定されたタイプと一致する必要があります。

T型から のインスタンスに移動する方法がわかりませんILoginResult<T>。の特定の型を実装するオブジェクトのインスタンスを作成できますがT、これは戻り値の型を満たしません。一般的で標準的な実装方法がないことをしようとしているのですか、それとも明らかな何かが欠けているだけですか?

追加データ:

これはちょっとしたテストの自動化です。LoginPage は、さまざまな設定に応じて、さまざまなページのいずれかにログインできるページ オブジェクトです。Tスーパークラスのすべてのサブクラスであるこれらのランディング ページの 1 つを表しPageBaseます。

私の古いコードでは、loginメソッドは の特定のサブクラスを返しましたPageBase。私はページにログインします-たとえばPage1-こうして:

LoginPage loginPage = new LoginPage(...);
Page1 page1 = (Page1) loginPage.login(parameters);

より多くのタイプ セーフを導入し、上記のインターフェイスを使用したキャストを避けるように指示されました。おそらく、コードは次のようになります。

LoginPage<Page1> loginPage = new LoginPage<Page1>(...);
Page1 page1 = loginPage.login(parameters);

私の問題は、戻り型を満たすこれらのオブジェクトのインスタンスを作成して返すことにありますILoginresult<T>Page1その implementのようなインスタンスを作成できますILoginResult<Page1>が、これは具体的すぎます。

4

2 に答える 2

4

単純にオブジェクトを作成しようとしましたか?

public class LoginPage<T> {
    public ILoginResult<T> login(...) {
        final T t = ...
        return new ILoginResult<T>() {
            @Override 
            public T get() { 
                return t; 
            } 
        };
    }
}
于 2013-07-03T17:23:49.203 に答える
2

ILoginResultの実装者を簡単に作成でき、インスタンスTの作成中に置換されますLoginPage

public ILoginResult<T> login() {
     ILoginResult<T> i = new ILoginResultImpl<T>();
     return i;
}

どこ

class ILoginResultImpl<T> implements ILoginResult<T> {
    ....
}
于 2013-07-03T17:24:26.337 に答える