是否可以从此Java方法中删除“Class <t>”参数?</t>

时间:2009-03-03 10:17:55

标签: java generics

我有一个带有以下签名的Java方法:

public <T> List<HtmlOptionsComposite> convertToHtmlOptionsCompositeList
    (List<? extends T> objects, 
     Class<T> clazz, 
     String getValueMethodName, 
     String getDescriptionMethodName, 
     String getDiscontinuedMethodName)
{ ... }

方法需要clazz参数才能对每个给定对象使用反射(clazz.getMethod(...)),但是我真的需要将其作为参数传递给方法吗?有什么方法可以重构代码来找出clazz应该自动生成的内容吗?

2 个答案:

答案 0 :(得分:3)

您可以在列表中的第一个对象上调用getClass()。这会给你一个Class<? extends T>而不是Class<T> - 特别是这意味着可能会有一些不应该给出的方法(因为它们不是T上的方法本身)。

答案 1 :(得分:1)

考虑:

public interface T {
    void foo (); 
}

class S {
    private class U implements T {
        public void foo () { ... }
    }

    private class V implements T {
        public void foo () { ... }
    }
}

如果使用列表的第一个实例的类,那么它可能与列表的其他实例的类不同 - 列表可能是S.U和S.V实例的混合。因此,您需要在列表中的每个实例上调用getClass()

此外,尽管T.foo()是公共的,但是U和V中的实现将不能在S之外访问,因为U和V是私有类。

因此,如果没有class参数,则需要获取其类的每个元素,按名称查找方法并设置该方法可访问。这是可能的,但这比一次获得公共方法要多得多。