Java通用List参数不可能?

jon*_*ney 6 java generics

我有一个简单的方法,采用一般的List参数但由于某种原因,我的IDE(Eclipse)说明它是如何解决的?

我在这里做错了什么

private OnClickListener removeFieldListener(final LinearLayout layout,
            List<T> viewList) {

        return new OnClickListener() {

            @Override
            public void onClick(View v) {
                int indexToDelete = layout.indexOfChild(v);

            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

Rid*_*del 16

在这种情况下,必须在某处定义T参数.因为我猜你的类没有声明这个参数,你必须把它放在你的方法声明中,比如

private <T> OnClickListener removeFieldListener(final LinearLayout layout,
        List<T> viewList) {
Run Code Online (Sandbox Code Playgroud)

但这只会将问题转移给这种方法的调用者......

  • 实际上,这不应该将问题转移到调用者身上——Java 将使用类型推断来根据传入的列表类型计算出 `T` 是什么。因此,相比之下,调用者不应该有任何额外的负担使用通配符或原始类型。 (2认同)
  • @jonney - 参见Riduidel的例子,`<T>`这是签名的第二部分.这意味着*method*是参数化的,无需向类中添加泛型参数.请参阅[泛型常见问题解答]的[通用方法部分](http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedMethods.html#Fundamentals). (2认同)

And*_*yle 12

Riduidel是对的,问题在于你没有宣布T任何地方.

根据您对列表内容的处理方式,您可以使用通配符. List<?> viewList如果你只是把Object它拉出来会有用; 或者List<? extends IListener>允许你从中获取IListeners等.

通常,如果只在方法中出现一次,则不需要通用参数,而应使用通配符.如果它确实出现多次,例如你从列表中删除了东西并将它们分配给类型的变量T,那么你确实需要通配符,你应该像Riduidel建议的那样参数化你的方法.