将泛型嵌入到泛型中

时间:2014-04-18 15:54:07

标签: java generics

假设我有2个接口,它们定义了某种容器格式,包含特定类型的数据。

public interface Content {
}

public interface Holder1<T extends Content> {
}

public interface Holder2<T extends Content> {
}

现在我想要一些转换器来定义可以将Holder1类型的对象转换为Holder2的对象。

此转换器应保留有关原始对象中存储的对象类型的信息:

public interface ConverterPrototype1 {
   public <U extends Content> Holder2<U> convert(Holder1<U> source);
}

但我也希望能够限制某些转换器可以使用的Holder1类型:

interface ConverterPrototype2<U extends Content, V extends Holder1<U>> {
   public Holder2<U> convert(V source);
}

有没有办法将这两个接口的语义合并为一个?像

这样的东西
//INVALID CODE!
interface CombinedConvertor<V extends Holder1> {
   public <U extends Content> Holder2<U> convert(V<U> source);
}

我不确定我的标题是否适合这个问题,但我找不到更好的描述......这里发布的类似问题似乎总是谈论不同的事情。

修改this link绊倒后,我提出了以下代码。它仍然无效,但更接近实际的java代码。

//INVALID CODE!
interface CombinedConvertor<X extends Source<?>> {
    public <U extends Content, V extends X & Source<U>> Target<U> convert(V source);
}

3 个答案:

答案 0 :(得分:0)

可以创建CombinedConvertor接口,只要您定义另一个泛型类型参数来表示Holder1的单个泛型类型参数,就像您已经对ConverterProptotype2所做的那样。这将从convert方法中删除泛型类型参数,并将其添加到接口本身。

interface CombinedConvertor<U extends Content, V extends Holder1<U>> {
   public  Holder2<U> convert(V source);
}

答案 1 :(得分:0)

如果我理解你的要求,从你的评论到另一个答案......你可以推断出两者。

public interface Converter
{
    public <U extends Content, V extends Holder1<U>> Holder2<U> convert(V source);
}

答案 2 :(得分:0)

找到编辑中发布的代码格式后,我发现很多相关项目都在讨论这个问题。看来java语言根本不支持这种情况。我可以推荐this post来详细了解此限制的详细信息。