Можно ли удалить параметр "Class <T>" из этого метода Java? - PullRequest
1 голос
/ 03 марта 2009

У меня есть метод Java со следующей подписью:

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

Параметр clazz требуется, чтобы метод использовал отражение (clazz.getMethod(...)) для каждого из заданных объектов, но действительно ли мне нужно передавать его как параметр в метод? Можно ли как-то реорганизовать код, чтобы определить, какой клац должен быть автоматически?

Ответы [ 2 ]

3 голосов
/ 03 марта 2009

Вы можете вызвать getClass() для первого объекта в списке. Это дало бы вам Class<? extends T>, а не Class<T>, хотя, в частности, это может означать, что некоторые методы, которые должны быть указаны, не должны быть (поскольку они не являются методами T).

1 голос
/ 03 марта 2009

Рассмотрим:

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 для каждого элемента вам нужно получить его класс, найти метод по имени и установить этот метод доступным. Это возможно, но это гораздо больше работы, чем один раз получить публичный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...