2016-07-29 1 views
1

Я использую java для создания проекта ведения журнала, и я нахожу метод, который хочет иметь параметр формы Class<HostResolver> hostResolver, где HostResolver .class - это интерфейс. Может ли кто-нибудь предположить, что я должен здесь проходить?Как передать переменную формы «Класс <HostResolver> hostResolver»

Если я перейду в HostResolver.class, он примет его как параметр, но затем сбой на hostResolver.newInstance(). Однако, если я передаю реализацию HostResolver, это говорит о том, что метод не подходит для этого метода.

Вот конкретный метод.

protected static HostResolver createHostResolver(final Class<HostResolver> hostResolver) throws 
     IllegalAccessException, InstantiationException { 
    return hostResolver.newInstance(); 
} 
+3

Этот метод объявляется плохо. Тип параметра должен быть «Class '. Требование, чтобы параметр * был * 'HostResolver', когда' HostResolver' является интерфейсом, просто неверно. Если вы не можете изменить метод, вы можете обойти эту проблему с еще худшим кодом: 'createHostResolver ((Class) MyHostResolver.class)'. Исходная команда 'Class' будет обходить проблему, но это * hack! * – Andreas

+0

Спасибо, оказывается, что метод должен был быть Class , но это изменение не было пропущено. – annedroiid

ответ

1

Оказывается, метод должен был иметь класс, но это изменение не было протолкнул. После того, как это было изменено, я был в состоянии передать его класс, который расширяет HostResolver

protected static HostResolver createHostResolver(final Class<? extends HostResolver> HostResolver) throws 
    IllegalAccessException, InstantiationException { 
return hostResolver.newInstance(); 

}

4

Ваши проблемы в том, что вы указали определенный класс в родовом, а не подстановочном знаке. Вам нужно указать подстановочный знак, если вы хотите передать реализацию. Затем вы должны иметь возможность передать объект класса для класса, который реализует HostResolver. Потому что newInstance называется, что класс должен иметь конструктор без аргументов.

Вот пример

interface Interface { 

} 

class Subclass implements Interface { 

} 

private static Interface makeHost(Class<? extends Interface> hostClass) 
     throws InstantiationException, IllegalAccessException { 
    return hostClass.newInstance(); 
} 


System.out.println(makeHost(Subclass.class).getClass().getName()); 
Смежные вопросы