[英]How to use generic super type in java
假设我有以下课程:
public interface Ordinal{}
public class One implements Ordinal {
public static final One FIRST = new One();
}
public class Two extends One {
public static final Two SECOND = new Two();
}
public class Three extends Two {
public static final Three THIRD = new Three();
}
然后是一个接口,其方法可以接受Ordinal
接口的任何子类型。
public interface UseOrdinal<T extends Ordinal> {
void use(T ordinal);
}
然后是一个实现接口的客户端。
public class Client implements UseOrdinal<Three> {
@Override
public void use(Three ordinal) {};
}
问题在于Client
的use
方法只能接受类Three
实例。 但我希望它也接受它的超类型,例如One
和Two
。 我该如何实现?
编辑(添加了问题上下文):在我的应用程序中,我加载了许多小的集合,范围从1到12个元素。 因此,为了使其更具可读性并减少异常处理,我想封装对它的元素的访问,以便代替T get(int index)
我将拥有T get(Ordinal o)
,其中Ordinal
仅包含特定集合的允许索引。
您必须使Client
类成为通用类,并将通用参数传递给UseOrdinal
。
public class Client<T extends Ordinal> implements UseOrdinal<T> {
@Override
public void use(T ordinal) {};
}
或只是简单地将Ordinal
作为通用参数传递,因为您的所有类均从其派生:
public class Client implements UseOrdinal<Ordinal> {
@Override
public void use(Ordinal ordinal) {};
}
稍后在use
方法主体时,您可以使用instanceof
关键字检查传递了什么类:
@Override
public void use(T ordinal) {
if (ordinal instanceof One) {
// handle object of class One
}
else if (ordinal instanceof Two) {
// handle object of class Two
}
else if (ordinal instanceof Three) {
// handle object of class Three
}
};
虽然,在我看来,拥有三个Client
类来处理三种不同的Ordinal
类型将是一个更好的(更多OOP)想法。
根据上下文,以下可能是更好的方法。 我假设您要避免对IndexOutOfBounds
进行运行时检查。
public interface OneElementCollection<T> {
T getFirst();
}
public interface TwoElementCollection<T> extends OneElementCollection<T> {
T getSecond();
}
// etc.
正如@Jezor所提到的那样,除非您需要类似元组数据结构且大小始终在[1..12]
之内,否则设计会有些问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.