我正在使用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对象。我如何更改这些定义以使其有效?
提前谢谢你
答案 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
。很难区分标识符Solutions
和Solution
。
答案 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”设计可能在这里更有益吗?