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