繁体   English   中英

如何在Java中使用泛型超类型

[英]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) {};
}

问题在于Clientuse方法只能接受类Three实例。 但我希望它也接受它的超类型,例如OneTwo 我该如何实现?

编辑(添加了问题上下文):在我的应用程序中,我加载了许多小的集合,范围从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM