基于泛型参数的java泛型类型推断

时间:2010-09-16 11:59:49

标签: java generics

我要做的是将通用对象(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中完成,还是有更好的方法。

感谢。

2 个答案:

答案 0 :(得分:3)

这对我有用:

// 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!";
            }
        });
    }
}

答案 1 :(得分:1)

我不清楚您想要什么 - 您是否希望filter使用与通用类ItemDelegate<T>不同的参数?然后我猜你应该使用不同的参数名称:

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有一个参数并抛出异常。

这两个问题共同意味着编译器无法推断出T的{​​{1}}。