3

ジェネリックメソッドで返したいクラスによって実装されるジェネリックインターフェイスがあります。インターフェース:

public interface IWorker<T extends Object, K extends Object> {  
public K doWork(T o);
}

実装:

public class WorkerImpl implements IWorker<String, List<Serializable>>
{
   @Override
   public List<Serializable> doWork(String s)
   {
       return ...
   }
}

実装を返す汎用メソッドの ActionCoordinator インターフェイス:

public interface IActionCoordinator
{
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(T  request);
}

ActionCoordinator の実装:

public class ActionCoordinatorImpl implements IActionCoordinator
{
    @Override
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(final T requ)
    {
        return (IWorker<T,K>)new WorkerImpl();
    }
}

問題: Eclipse ではこれは機能しますが、JDK 1.6.0_35 で Maven ビルドを実行しても機能せず、「変換できない型」と表示されます。私はそれで回避できます:

public class ActionCoordinatorImpl implements IActionCoordinator
{
    @Override
     public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(final T requ)
    {
        Object temp = new WorkerImpl();
        return (IWorker<T,K>)temp;
    }
}

しかし、それは想定されていないことであり、タイプセーフではありません。

いくつかのアイデアはいいでしょう。前もって感謝します...

編集:今私にとってうまくいくのは次のとおりです: すべての一般的な T と K をシリアライズ可能に変更しました。WorkerImpl を制限するために必要だったのはこれだけです。実際の呼び出し元はまだ必要ですIWorker<T,K>が、IWorker<Serializable,Serializable>フィットして機能します...みんなに感謝しますが、Eclipseが何も言わないのはなぜだろうか...

4

3 に答える 3

2

問題は、mavenコンパイルされないことではなく、Eclipse が安全でないキャストについて不平を言っていないことです。おそらく、Eclipse 設定でオプションがオフになっていて、maven で厳密なコンパイルを行っています。

あなたWorkerImplのファクトリ メソッドから を返すのは不適切です。なぜなら、そのメソッドに渡される が a になるActionCoordinatorImplという保証がないからです- それは any でなければなりません。SerializabledoWork()StringSerializable


IWorkerまた、から 変更することでコードを簡素化できます

public interface IWorker<T extends Object, K extends Object>

public interface IWorker<T, K>

それらは同等であるため(すべてがオブジェクトを拡張します)

于 2012-09-20T13:38:14.850 に答える
0

あなたのWorkerImpl唯一の実装IWorker<String, List<Serializable>>IWorker<T extends Serializable, K extends Serializable>次に、ActionCoordinatorImplそれを正しくないものにしようとし、エラーとして報告する必要があります。

何をしたいのかが明確になるまで、修正を推奨するのは難しいでしょう。

于 2012-09-20T13:48:15.220 に答える
0

new WorkerImpl()利回りIWorker<String, List<Serializable>>、どのようにに変換し IWorker<T,K>ますか? そして、コンパイラはどこで型を取得する必要があると思いますKか? 呼び出すときに常に明示的に渡しますgetActionか? 次に typeTも渡す必要がありますが、これも parameter によって設定されているためrequ、呼び出しが見苦しくなります。

于 2012-09-20T13:53:46.273 に答える