Java泛型,扩展泛型和抽象类

时间:2009-06-07 09:16:39

标签: java generics inheritance abstract

我已经设置了以下课程:

public abstract class Process<T,S> {
    ...
}

public abstract class Resource<T, S extends Process<T, S>> {
    protected S processer;
    ...
}

public class ProcessImpl<EventType1, EventType2> {
    ...
}

public class ResourceImpl extends Resource<EventType1, ProcessImpl> {
    processer = new ProcesserImpl();
    ...
}

在我到达ResourceImpl之前,一切都很好。我被告知,ProcessImpl不能替代<S extends Process<T,S>>类型的有界参数Resource<T,S>

我已经尝试了各种方法来解决这个问题,并继续撞墙。

有没有人有任何想法?

4 个答案:

答案 0 :(得分:11)

public class ProcessImpl<EventType1, EventType2> {
...
}

因为ProcessImpl没有扩展进程。您的ProcessImpl不是从Process派生的,这就是您声明该参数应该是。

答案 1 :(得分:1)

您可能想要这样做:

public abstract class Process<T, S> {
}

public abstract class Resource<T, S extends Process<T, S>> {
    S processor;

}

public class ProcessImpl extends Process<EventType1, ProcessImpl> {
}

public class ResourceImpl extends Resource<EventType1, ProcessImpl> {

}

如果您将S的{​​{1}}参数限制为处理器,则还需要在Resource类上正确声明它。我不知道ProcessImpl是什么,但它应该是实现Process接口。我以为你其实想说EventType2

答案 2 :(得分:0)

我看不到编辑原始版本的方法,也没有更好的代表来评论给定的答案。

此代码将存在于Web层上,eventtype2在持久层上定义,只能在此级别下面的核心层中访问。

所以很遗憾没有紧密耦合,我想避免,我没有访问EventType2。

答案 3 :(得分:0)

如果您不希望您的代码依赖于某个包含Process的现有包,您还可以在类层次结构的最底层引入一些新的接口包。 (如果你能够改变继承的约束。)