使用Java泛型的包装层次结构

时间:2013-10-17 17:04:46

标签: java generics inheritance

有没有办法使用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将要处理的事情吗?

2 个答案:

答案 0 :(得分:2)

你可以使用

class WrapsB extends WrapsA {
    B getWrapped();
}

因为你被允许在overriden方法中返回子类(据我记得,它可以从Java SE6开始)

答案 1 :(得分: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的内容迁移到抽象类。我们仍然没有WrapsB两者都是WrapsA而且是Wraps<B>