Java 对原始类型的未经检查的调用

sca*_*age 5 java generics

我正在尝试创建一个Handler接口,它能够根据事件的类型处理不同类型的事件。我遇到以下警告问题:

Unchecked call to 'handle(T)' as a member of raw type 'Handler'

这是我的课程。

public interface Handler<T> {
    void handle(T event); }

public class IntegerHandler implements Handler<Integer> {
    @Override
    public void handle(Integer event) {
        System.out.println("Integer: " + event);
    }
}

public class ObjectHandler implements Handler<Object> {
    @Override
    public void handle(Object event) {
        System.out.println("Object: " + event);
    }
}

public class StringHandler implements Handler<String> {
    @Override
    public void handle(String event) {
        System.out.println("String: " + event);
    }
}

public class TestHandlers {

    public static void main(String[] args) {

        String a = "hello";
        Integer b = 12;
        Long c = 23L;

        dispatch(a).handle(a);
        dispatch(b).handle(b);
        dispatch(c).handle(c);
    }

    private static Handler dispatch(Object o) {
        if (o instanceof String) {
            return new StringHandler();
        } else if (o instanceof Integer) {
            return new IntegerHandler();
        } else {
            return new ObjectHandler();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出看起来正确:

String: hello
Integer: 12
Object: 23
Run Code Online (Sandbox Code Playgroud)

我想问题是我的dispatch方法返回了未经检查的版本Handler

不确定正确执行此操作的正确方法是什么。

Tib*_*gan 0

创建一个工厂(归功于具有未知实现类的通用工厂

public class HandlerFactory<H extends Handler> {

final Class<H> handlerClass;

protected HandlerFactory(final Class<H> clazz) {
    handlerClass = clazz;
}

protected H create() throws InstantiationException, IllegalAccessException {
    H handler = handlerClass.newInstance();
    return handler;
}

public static <H extends Handler> HandlerFactory<H> createFactory(final Class<H> clazz) throws InstantiationException, IllegalAccessException {
    return new HandlerFactory(clazz);
}

public static Handler dispatch(Object obj) throws InstantiationException, IllegalAccessException {
    Class c;

    if (obj instanceof String) {
        c = StringHandler.class;
    } else if (obj instanceof Integer) {
        c = IntegerHandler.class;
    } else {
        c = ObjectHandler.class;
    }
    HandlerFactory factory = HandlerFactory.createFactory(c);
    return factory.create();
}
Run Code Online (Sandbox Code Playgroud)

}

未显示异常处理程序:

...
String a = "hello";
Integer b = 12;
Long c = 23L;

HandlerFactory.dispatch(a).handle(a);
HandlerFactory.dispatch(b).handle(b);
HandlerFactory.dispatch(c).handle(c);
Run Code Online (Sandbox Code Playgroud)