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表示这些登录页面之一,它们都是超类的子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 回答