【问题标题】:java generic type inference based on generic argument基于泛型参数的java泛型类型推断
【发布时间】:2010-09-16 11:59:48
【问题描述】:

我想要做的是将泛型对象(ItemDelegate)内部的泛型方法(过滤器)发送到另一个泛型方法(getItem)。问题是第二种方法(getItem)无法推断出正确的类型。

// Generic object
public class ItemDelegate<T> {
    public <T> T filter() {
        return null;
    }
}

// Generic method (receiver):
public static <T> T getItem(ItemDelegate<T> delegate) {
    T item = delegate.filter();
    //... do something
    return item;
}

// Usage in code:
getItem(new ItemDelegate<String>() {
    public String filter() {
        return "Hi!";
    }
}

此代码在 getItem 中生成编译错误:

T的类型参数无法确定;上界为 T,java.lang.Object 的类型变量 T 不存在唯一的最大实例

这甚至可以在 java 中完成还是有更好的方法。

谢谢。

【问题讨论】:

  • 是filter()还是filter(ResultSet x)?
  • 已编辑 - 应该是 filter()

标签: java generics


【解决方案1】:

这对我有用:

// Generic object
public class ItemDelegate<T> {
    public T filter() {
        return null;
    }

    // Generic method (receiver):
    public static <R> R getItem(ItemDelegate<R> delegate) {
        R item = delegate.filter();
        // ... do something
        return item;
    }

    public static void main(String[] args) {
        // Usage in code:
        getItem(new ItemDelegate<String>() {
            @Override
            public String filter() {
                return "Hi!";
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    我不清楚你想要什么 - 你想让filter 在与泛型类ItemDelegate&lt;T&gt; 不同的参数上泛型吗?那我猜你至少应该使用不同的参数名称:

    public class ItemDelegate<T> {
        public <U> U filter() {
            return null;
        }
    }
    

    或者如果你需要相同的参数,不要重新声明它:

    public class ItemDelegate<T> {
        public T filter() {
            return null;
        }
    }
    

    另一个问题是,你实际上并没有在你的匿名类中覆盖filter

    getItem(new ItemDelegate<String>() {
        public String filter(ResultSet x) throws SQLException {
            return "Hi!";
        }
    }
    

    因为这个filter有一个参数并且抛出了一个异常。

    这两个问题一起意味着编译器无法推断TItemDelegate.filter

    【讨论】:

    • @nanda 你到底要如何将它放入 cmets
    • @nanda,请允许我不同意。但是,一旦您向我解释如何将其放入 600 个字符之内,我就会重新考虑;-)
    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多