当我只有T?</t>时,如何返回Interface <t>的实例

时间:2013-07-03 17:18:40

标签: java generics interface

我有一个界面:

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的实例ILoginResult<Page1>,但这太具体了。

2 个答案:

答案 0 :(得分:4)

您是否尝试过简单地创建对象?

public class LoginPage<T> {
    public ILoginResult<T> login(...) {
        final T t = ...
        return new ILoginResult<T>() {
            @Override 
            public T get() { 
                return t; 
            } 
        };
    }
}

答案 1 :(得分:2)

您只需创建ILoginResult的实施者,T将在创建LoginPage实例时替换<{1}}

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

,其中

class ILoginResultImpl<T> implements ILoginResult<T> {
    ....
}