0

我有以下几组课程:

public abstract class GSObject<T extends GSObject<T>> {
    public abstract boolean matches(String toMatch);
    //Other functions
    public static <T extends GSObject<T>> T findMatch(List<T> objects, String toMatch){
        //Code that iterates through the list, seeing if one matches;
    }
}

public abstract class Phrase extends GSObject<Phrase> {
    //More code
}
public class Request extends Phrase{
    @Override
    public boolean matches(String toMatch){
        //Implementation of matches()
    }
}

运行以下命令:Request.findMatch(allRequests,chat);给出以下错误: Bound mismatch: The generic method findMatch(List<T>, String) of type GSObject<T> is not applicable for the arguments (List<Request>, String). The inferred type Request is not a valid substitute for the bounded parameter <T extends GSObject<T>>

如果我这样做Phrase.findMatch(allPhrases, chat);,它不会引发错误,这意味着这与双重继承有关。我是否必须编写另一个与扩展 GSObject 的类一起使用的静态函数?

我已经研究过让 GSObject 成为一个接口,但它有一些我想在类中定义(不是抽象地)的类。

有什么我遗漏的东西(在三个类中的任何一个中),还是我需要创建一个定义函数的接口matches()(我试图避免什么)?

4

1 回答 1

0

一种选择是以Phrase相同的方式进行泛型,即GSObject

public abstract class Phrase<T extends Phrase> extends GSObject<T> {

public class Request extends Phrase<Request> {

这样,Request扩展GSObject<Request>(与您的代码中的Request扩展不同GSObject<Phrase>)。

另一种选择可能是通过使用通配符来解耦这些依赖类型中的一些,例如通过以下之一:

    public static <T extends GSObject<T>> T findMatch(List<? extends T> objects, String toMatch){

    public static <U extends GSObject<?>> U findMatch(List<U> objects, String toMatch){

尽管这可能很难做到。请注意,使用这种方法,Request仍然会宣传它可以处理 any List<? extends Phrase>,因此您失去了静态类型系统的一些好处。(换句话说,这些版本让你的类比他们真正应该的更宽松。)

第三种选择是同时执行上述两项。毕竟,Request.findMatch采取List<? extends Request>.

如果没有看到更多代码,很难知道其中哪一个对您的情况最有意义。

于 2013-06-09T16:30:20.513 回答