Java泛型列表参数不可行?

11

我有一个简单的方法,它带有一个通用列表参数,但出于某种原因,我的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);

            }
        };
    }

我只是想补充一下Riduidel的回答,除非OnClickListener也打算使用T,否则在这种情况下似乎不需要通用参数。即,private <T> OnClickListener<T> removeFieldListener ... - Yoni
2个回答

21

在这种情况下,T参数必须在某处定义。我猜您的类没有声明此参数,因此您必须将其放在方法声明中,例如:

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

但是这只会把问题转移给调用此方法的人...

2
实际上,这不应该将问题移交给调用者 - Java 将使用类型推断来确定基于传递的列表类型的 T 是什么。因此,与使用通配符或原始类型相比,调用者不应该承担任何额外的负担。 - Andrzej Doyle
1
啊好的,我该如何在类中定义这个泛型T?我知道可以这样写public class hello<T>,但是如果这么写,整个类的调用者都需要指定这个泛型类型,而我不想这么做,因为上面的方法是一个私有方法,并且处理的是在这个类内部处理的私有变量,而不是这个类的调用者。我猜想我可以在这个类的声明中使用类似于private Generic T; 的东西? - Jono
2
@jonney - 在Riduidel的例子中,第二部分签名中的<T>表示该方法是参数化的,而无需您向类添加通用参数。请参见泛型FAQ的通用方法部分 - Andrzej Doyle
1
是的,我明白了。谢谢。简而言之,泛型可以在类定义或方法定义中定义。太好了。你每天都会学到新东西。祝大家好运。 - Jono
我能否在方法内部识别 T 属于哪个类实例? - Vivek Pratap Singh

14
Riduidel是正确的,问题在于您没有声明T的任何内容。根据您想要使用列表内容的方式,很有可能您只需要使用通配符。如果您只是从中提取对象,则List viewList将起作用;或者如果您想要获取IListeners,则List 将起作用。一般来说,如果方法中只出现一次泛型参数,则不需要泛型参数,应改用通配符。如果它确实出现多次,例如您从列表中删除东西并将其分配给类型为T的变量,则确实需要通配符,并且应该使方法具有参数化如Riduidel所建议的

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接