我有一个界面:
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>
,但这太具体了。
答案 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> {
....
}