我正在尝试使用泛型和供应商来避免需要对静态工厂方法的结果进行类型转换,但失败了。我想我已经接近了,有人可以指出我在这里做错了什么吗?
这是参数化接口IManager:
public interface IManager<C extends IConfigObject> {
下面是一个抽象基类AbstractManager,其中包括静态工厂方法:
public abstract class AbstractManager<C extends IConfigObject> implements IManager<C> {
....
public static <C extends IConfigObject> AbstractManager<C> getInstance(Supplier<? extends AbstractManager<C>> supplier) {
接下来,这里有一个名为MyManager的具体实现,它使用MyConfigObject进行参数化,而MyConfigObject又实现了IConfigObject:
public final class MyManager extends AbstractManager<MyConfigObject> {
最后,main(( 代码:
Supplier<MyManager> supplier = MyManager::new;
MyManager manager = (MyManager) AbstractManager.getInstance(supplier);
如果我那里没有强制转换,我会收到一个编译器错误:
类型不匹配:无法从 AbstractManager to MyManager
有什么建议吗?
你的问题在这里:Supplier<? extends AbstractManager<C>>
.通过使用通配符,您说"我不在乎实际类型",但您确实如此。
这里的关键是首先使用两个类型参数,其中第二个依赖于第一个(我用M
表示"管理器"(:
public static <C extends IConfigObject, M extends AbstractManager<C>>
M getInstance(Supplier<M> supplier)
{
// ...
}
如果未在方法主体中使用C
,则可以将其重构为:
public static <M extends AbstractManager<? extends IConfigObject>>
M getInstance(Supplier<M> supplier)
{
// ...
}