1

有没有办法使用 Java 泛型来表达如下的类型层次结构?

class A { ... }

class B extends A { ... }

interface Wraps<T> {
  T getWrapped();
}

class WrapsA implements Wraps<A> {
  A getWrapped();
}

class WrapsB extends WrapsA /* implements Wraps<B> */ {
  B getWrapped();
}

我知道编写 Java 的类型系统会拒绝此代码,但是有什么方法可以指定类型参数或继承层次结构来使其正常工作?

编辑:我意识到我遇到的真正问题是我正在尝试在我的 API 中强制执行类型安全,例如

<T extends A> T unwrap(Wraps<T> wrapper, Class<T> wrappedClass);

我不能用unwrap(wrapsB, B.class). 这是Java会处理的事情吗?

4

2 回答 2

2

你可以使用

class WrapsB extends WrapsA {
    B getWrapped();
}

由于您可以在覆盖的方法中返回子类(据我所知,这可能来自 Java SE6)

于 2013-10-17T17:09:45.073 回答
0

查看自界类型。

interface Wraps<T, W extends Wraps<T, W>> { ... }

abstract class AbstractWrapsA< T extends A, W extends AbstractWrapsA< T, W > implements Wraps< T, W > { ... }
class WrapsA extends AbstractWrapsA< A, WrapsA > {}
class WrapsB extends AbstractWrapsA< B, WrapsB > { ... }

编辑:实际上,为了满足 OP 的需要,我们可以省去自界类型,而只是将内脏迁移WrapsA到抽象类。我们仍然没有WrapsBis-aWrapsA和 is-a Wraps<B>

于 2013-10-17T18:13:38.213 回答