【问题标题】:Parameterizing a parameterized method's return type参数化参数化方法的返回类型
【发布时间】:2012-10-31 12:08:16
【问题描述】:

我一直在努力让这样的事情发挥作用:

private static <V, K> V<KnownType> from(K oldObject, Class<? extends V<KnownType>> newClass) {
    ...
}

但是,此方法签名会出现编译器错误:

V 型不是泛型的;它不能用参数&lt;KnownType&gt;进行参数化

基本上,我想要一个将K 转换为V&lt;KnownType&gt; 的方法。这可能吗?

此外,如果有人为此编写代码,还有一些额外的上下文 - 所有V 都有一个单参数构造函数,它接受K

提前致谢。

编辑 -- 输入类是V的子类。(? extends V...)

【问题讨论】:

  • 你能改变相关类的继承层次吗?
  • 我正在 SDK 之上构建一个层,该层本身无法修改。所以我不能修改KKnownType,但我可以修改V及其所有子类。
  • 为什么需要这样做?反射是脆弱的。
  • 因为我讨厌重复的代码。

标签: java generics type-conversion parameterized


【解决方案1】:

假设:

public interface SomeType<E>

试试这个:

private static <V extends SomeType<KnownType>, K> V from(K oldObject, Class<V> newClass) {

【讨论】:

  • 当我问你是否可以更改继承层次结构时,我想到了这一点。根据您的回复,听起来您可以做到:在您希望能够用于V 的类的祖先中引入SomeType
  • 我试图避免更改这些类,但这似乎是唯一的解决方案。谢谢大家。
【解决方案2】:

Java 中的类型参数只能对应一个类型。您希望V 成为本身采用类型的东西,一种对类型进行操作的更高“种类”的东西。 Java 中的泛型不适用于更高的种类。

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多