Невозможно привести при использовании отражения в Java - PullRequest
1 голос
/ 06 января 2011

После вчерашнего отличного ответа Coobird вчера у меня возникли проблемы с размышлениями о работе на Java.Сначала я опубликую классы, а затем подробно расскажу.

StHandler.java

package ds; public interface StHandler {
public void read();
}

DiStHandler.java

package ds;
public class DiStHandler {
public void read() {
System.out.println("Hello world");
}

Server.java

package ds;
public class Server {
public static void main(String[] args) {
try {
Class<?> clazz = Class.forName("ds.DiStHandler");
StHandler input = (StHandler) clazz.newInstance();
input.read();
}
catch(Exception e) {}
}

Что я пытаюсь сделать: у меня есть интерфейс StHandler, который на данный момент я хочу иметь единственный метод: read ().DiStHandler - это класс реализации, доступный из пути к классам.Я пытаюсь вызвать метод чтения отсюда.

Проблема: На линии

StHandler input = (StHandler) clazz.newInstance();

Я получаю сообщение об ошибке: ds.DiStHandler cannot be cast to ds.StHandler

У меня естьпытался отладить это в течение почти двух часов, но я не могу понять, в чем проблема.Причина, по которой у меня нет implements StHandler в DiStHandler, заключается в том, что я создаю DiStHandler в отдельном проекте.

Буду очень признателен за любые советы по этому вопросу.Большое спасибо заранее,

M

Ответы [ 2 ]

8 голосов
/ 06 января 2011

Вы не можете привести DiStHandler к StHandler, если DiStHandler не реализует этот интерфейс. Reflection не позволяет вам разрушить систему типов - все должно быть безопасным для типов.

Если DiStHandler не может реализовать StHandler, то вам нужно что-то еще, что делает и которое в свою очередь вызывает DiStHandler (то есть класс адаптера).

0 голосов
/ 06 января 2011

Вы пишете

Причина, по которой у меня нет

DiStHandler реализует StHandler

, потому что я создаю DiStHandler вотдельный проект.

Даже если StHandler находится в другом проекте, вы все равно можете использовать эту конструкцию.Действительно, это может быть хорошим дизайном для разделения проектов.Если это так, вам следует обратиться к таким инструментам, как maven, для управления зависимостями - ваш DiStHandler будет зависеть от StHandler.Вхождение в вашу цепочку инструментов быстро окупится с точки зрения модульности

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