【问题标题】:Nesting generics into generics将泛型嵌套到泛型中
【发布时间】:2014-06-03 04:05:51
【问题描述】:

假设我有 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);
}

【问题讨论】:

  • 我可能只是遗漏了一些东西,但是......你已经保证 Holder1Holder2 只能在它们的定义中包含扩展 Content 的东西。
  • 正确,但我想知道使用转换器时返回的特定类型(对于Content 的任何可能实现),而不是简单地使用接口。我希望这是有道理的:)

标签: java generics


【解决方案1】:

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

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

【讨论】:

  • 我不确定我是否理解,使用ConvertorPrototype2 我将无法执行以下操作,例如:Holder2&lt;MyContent&gt; holder2 = convertor.convert(new Holder1Impl&lt;MyContent&gt;())。也就是我想把内容的泛型类型从接口描述中去掉。
【解决方案2】:

如果我理解你在问什么,并且从你的评论到另一个答案......你可以推断出两者。

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

【讨论】:

  • 这非常接近,但它不允许我限制 Holder1 的类型以用作 Converter 的输入参数。例如,我想要一个仅适用于 Holder1SubInterface 的转换器。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多