多个通配符边界

Kel*_*ung 8 java generics bounded-wildcard

假设我有以下课程:

public class Either<A, B> {
    public Object get();
}
Run Code Online (Sandbox Code Playgroud)

Either是一种存储A或B类型的对象的类型. get()检索该对象.

现在的问题是,是否有可能使用泛型改变的方法签名get(),以便返回的类型不只是Object,但A和B的公用超例如,Either<Integer, Long>可以有get()回报Number,一个Either<Deque<T>, Set<T>>能有get()回报Iterable<T>或者Collection<T>,等等.(显然,Either<Foo,Foo>应该有get()回报Foo).

如果这是可能的话,如果我有Either<List<A>, List<B>>,那么最具体的类型get()可以返回什么?它是原始的List,通配符List<?>还是完全不同的东西?

dav*_*vek 1

为什么不定义一个抽象类 C,其中包含您认为必要的 A 和 B 共有的逻辑,并在 Either 类中引用它:

public class Either<C> {
    public C get();
}
Run Code Online (Sandbox Code Playgroud)

这似乎不是一个很好的答案,但由于 Java 在编译时无论如何都会删除您的类型信息(也就是说,您编译的代码只看到Object而不是 anA或 a B),那么您最适合定义应该做什么保留在显式公共类中。