【问题标题】:About error using Java generics: "type parameter S is not within its bound"关于使用 Java 泛型的错误:“类型参数 S 不在其范围内”
【发布时间】:2011-05-24 07:24:00
【问题描述】:

我正在使用泛型编写一些类,但找不到解决方案 对于类 SolutionsSubset ,所以我得到了错误 “类型参数 S 不在其范围内”。我以前读过 关于相同错误的问题,但我无法解决我的情况。 有人可以帮助我提高对泛型的了解吗?任何 参考一本好书(我可以在google上找到很多资料 但如果有人可以推荐一本书,教程等将受到欢迎)。 尽管我试图牢记提问的规则,但我 如果我的问题不符合这些规则,我们深表歉意。

我有以下类和接口:

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 存储解决方案对象。我必须如何更改这些定义才能使其正常工作?

提前谢谢你

【问题讨论】:

    标签: java generics syntax-error


    【解决方案1】:

    为了在MathSubset 中用作类型参数,SolutionsSubsets S 必须是extend Comparable&lt;S&gt;。作为一个可编译的例子:

    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>
    { }
    

    几个cmets:这是一个非常抽象的例子,所以不容易思考。布置代码以便您不需要滚动是好的。这里有大量的继承,也许是组合而不是扩展TreeSet。很难区分标识符SolutionsSolution

    【讨论】:

    • 谢谢。尽管我最终更改了设计以使其更简单,但您的解决方案很有趣。
    【解决方案2】:

    泛型是一种很快就会失控的东西,尤其是当您尝试一次“全部通用”时。少即是多。总是对我有帮助的是开始具体(包括实现),然后慢慢地替换泛型参数,一次一个参数和一个类。

    有人可以帮助我提高我对泛型的了解吗?

    http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

    不是教程,而是很多有用的信息。它是您阅读可以理解的部分的参考资料之一,但随着您获得更多掌握并且更多内容开始变得有意义,您会一遍又一遍地回来。

    【讨论】:

    • 非常感谢。这是一个关于 Java 和泛型的非常好的网站。
    【解决方案3】:

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

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

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

    public class SolutionsSubset<S extends Comparable<S>> extends
        MathSubset<S> implements Solutions<Solution<S>>;
    

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

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

    【讨论】:

    • 感谢您的帮助;我最终决定改用“有”的设计。无论如何,您的解决方案帮助我更好地理解 Java 中的泛型
    猜你喜欢
    • 2018-01-22
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多