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

时间:2010-12-12 17:51:10

标签: java generics syntax-error

我正在使用Generics编写一些类,但我找不到解决方案 对于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类存储Solution对象。我如何更改这些定义以使其有效?

提前谢谢你

3 个答案:

答案 0 :(得分:7)

要在MathSubset中用作类型参数,SolutionsSubset s 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>
{ }

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

答案 1 :(得分:2)

泛型是一种很快就会失控的东西,特别是如果你试图同时“全部通用”的话。少即是多。总是帮助我的是开始具体(包括实现),然后慢慢地将泛型参数替换为一个参数和类。

  

有人可以帮助我提高我对仿制药的认识吗?

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

不是教程,而是大量有用的信息。其中一个参考文献是你阅读了你能理解的部分,但是随着你获得更多的掌握而更多的掌握开始变得有意义,将来会一遍又一遍地重复。

答案 2 :(得分:1)

首先,这是完整错误(特定于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<?> - 这些类型彼此无关,因为解决方案不会继承或实现{{1} }}

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

Comparable<T>

不幸的是,这仍然无效,因为MathSubset实现了Iterable,但解决方案也是如此。

一个简单的解决办法就是解决方案不能扩展Iterable,但对我来说听起来像是在试图使用比你需要的更复杂的方法。可能是“has-a”而不是“is-a”设计可能在这里更有益吗?

相关问题