关于使用Java泛型的错误:"类型参数S不在其范围内"

use*_*694 9 java generics syntax-error

我正在使用Generics编写一些类,但我找不到类SolutionsSubset的解决方案,所以我得到错误"类型参数S不在其范围内".我之前已经读过有关同一错误的问题,但我无法解决这个问题.有人可以帮助我提高我对仿制药的知识吗?任何对好书的参考(我可以在谷歌中找到很多信息,但如果有人可以推荐一本书,教程等,将是受欢迎的).虽然我试着记住提出问题的规则,但如果我的问题不符合这些规则我会道歉.

我有以下类和接口:



public interface Subset<T extends Comparable<T>> extends Comparable<Subset<T>>
public class MathSubset<T extends Comparable<T>> extends TreeSet<T> implements Subset<T>

public interface Solution<T extends Comparable<T>>

public interface Solutions<S extends Solution<?>> extends Iterable<S>
public class SolutionsSubset<S extends Solution<?>> extends MathSubset<S> implements Solutions<S>


我需要Subset扩展Comparable.在SolutionsSubset中,MathSubset类存储Solution对象.我如何更改这些定义以使其有效?

提前谢谢你

Tom*_*ine 7

为了用作类型参数MathSubset,SolutionsSubsets S必须extend Comparable<S>.作为一个可编辑的例子:

import java.util.TreeSet;

interface Subset<T extends Comparable<T>>
     extends Comparable<Subset<T>> { }

class MathSubset<T extends Comparable<T>>
    extends TreeSet<T>
    implements Subset<T>
{
    public int compareTo(Subset<T> other) { throw new Error(); }
}

interface Solution<T extends Comparable<T>> { }

interface Solutions<S extends Solution<?>> extends Iterable<S> { }

class SolutionsSubset<S extends Solution<?> & Comparable<S>>
    extends MathSubset<S>
    implements Solutions<S>
{ }
Run Code Online (Sandbox Code Playgroud)

一些评论:这是一个非常抽象的例子,因此不容易思考.布置代码,所以你不需要滚动是好的.这里有很多遗产,可能是构成而不是延伸TreeSet.很难区分标识符SolutionsSolution.


Ebo*_*ike 2

首先,这是完整的错误(特定于 MathSubset 没有获得正确的参数):Bound mismatch: The type S is not a valid substitute for the bounded parameter <T extends Comparable<T>> of the type QifFixer.MathSubset<T>

问题是 MathSubset 需要一个<T extends Comparable<T>,但你给它一个S extends Solution<?>- 这些类型彼此无关,因为解决方案不会继承或实现Comparable<T>

如果有的话,你可以尝试这个:

public class SolutionsSubset<S extends Comparable<S>> extends
    MathSubset<S> implements Solutions<Solution<S>>;
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仍然不起作用,因为 MathSubset 实现了 Iterable,但 Solutions 也是如此。

一个简单的修复方法是解决方案不扩展 Iterable,但在我看来,您确实正在尝试使用比您需要的更复杂的方法。也许“has-a”而不是“is-a”设计在这里可能更有利?