2010-09-16 184 views
1

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

// 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,没有唯一的最大实例,其上限为T,java.lang.Object

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

谢谢。

+2

是否过滤()或过滤器(ResultSet的X)? – Jerome 2010-09-16 12:07:13

+0

编辑 - 它应该是过滤器() – 2010-09-16 12:23:20

回答

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

这两个问题加在一起意味着编译器不能推断出ItemDelegate.filterT

+1

@nanda你要如何适应这个评论 – ant 2010-09-16 12:13:45

+0

@ nanda,让我不同意。但是,只要你向我解释如何在600个字符内适合这个问题,我会立即重新考虑;-) – 2010-09-16 12:14:05

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