2
私はHandler
インターフェースを作成しようとしています。このインターフェースは、そのタイプに基づいてさまざまなタイプのイベントを処理できます。ここでJava未チェックの生タイプへの呼び出し
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();
}
}
}
出力が正しいよう:
String: hello
Integer: 12
Object: 23
私は問題が私のdispatch
方法はHandler
の未チェックのバージョンを返しているということだと思います。
これを行うには、適切な方法が何であるか不明です。図示していない
理由だけではなく、 ''から '' 'handle'''呼び出します'ディスパッチ' 'メソッド?つまり、 '' '' new StringHandler.handle((String)o); '' ' –
コードはすでに動作しているので、コードを修正しようとしていません。私はデザインの質問をしようとしています。 – scabbage
'dispatch(a).handle(b)'を試しましたか? [生の型](http://stackoverflow.com/q/2770321/2891664)を返すと、 'Handler'は基本的にあなたのコードを非ジェネリックにします。あなたが望むものは 'static Handler dispatch(T o)'ですが、実際にはタイプセーフではありません。少なくとも私は 'static Handler ディスパッチ(クラスc)'への変更を提案します。 –
Radiodef