非泛型类中的泛型方法

17

我正在尝试使用一个通用方法,以便不必重复编写代码。我已经尝试了:

private Listener createListenerAdapter(Class<T> clazz)
{ 
   // do something
}

clazz很重要,因为class是保留字)。

但Netbeans抱怨说:“找不到符号类T”。

我将传递几个具有相同方法的不同类。 我应该在哪里定义T?

3个回答

37

将方法声明为:

private <T> Listener createListenerAdapter(Class<T> clazz)

请参阅Java教程以获取更多信息。

编辑:如果T与返回类型无关,则还可以使用通配符:

private Listener createListenerAdapter(Class<?> clazz)

编辑1: 如果 clazz 代表一种 Listener 类型,可以定义边界来限制调用者(避免强制转换和潜在的运行时异常):

private <L extends Listener> L createListenerAdapter(Class<L> clazz)

或者使用通配符:
private Listener createListenerAdapter(Class<? extends Listener> clazz)

但这取决于在代码块中如何使用clazz


clazz 是 GWT 中的 GUI 小部件。 - user195488
好的,也许 Class<? extends Widget> 是最合适的选择。 - Paul Bellora
有没有一种方法可以在createListenerAdapter()内调用与类内方法对应的clazz上的方法?因此,如果我传递ButtonWidget,我想能够调用clazz.setEnable(true)。所有小部件都具有相同的方法调用。我将ButtonWidget作为createListenerAdapter(myWidget.getClass())传递。clazz.setEnable(true)不起作用,因为它认为我正在请求Class<?>上的方法。 - user195488
是的,这是一个实例方法。我有几个从同一超类派生的类,但有没有办法告诉我传入了哪个子类?我尝试过 Class<? extends MySuperClass> 但那并没有给我子类。有几个不同的子类。 - user195488
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/21540/discussion-between-paul-bellora-and-0a0d - Paul Bellora
显示剩余3条评论

4

通用声明也可以在方法级别上进行,通过像这样使它们参数化:

private <T> Listener createListenerAdapter(Class<T> clazz)
{ 
   // do something
}

0

如果您没有使用类型(不太可能,但您可能正在尝试避免原始类型警告):

private Listener createListenerAdapter(Class<?> clazz)
{ 
   // do something, without knowing the T of the clazz
}

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