2016-10-13 11 views
-2

私は次のエラーが表示されますConcurrentLinkedQueueのaddメソッドを使用して問題を抱えている使用して、引数の不一致:Javaのジェネリック

方法がタイプConcurrentLinkedQueueに(メッセージ)を追加の引数には適用されません ですが(クラス)

基本的には、私はそれが奇妙な原因「要求」はインターフェイスを拡張するインタフェースである見つける

、(タイプメッセージでなければなりません)引数「タイプは、」間違ったクラスであることを述べています"Message"というように、 "Request"を拡張する 'type'は "Message"タイプでもあります。

ありがとうございます。

package bgu.spl.mics; 
import java.util.concurrent.ConcurrentHashMap; 
import java.util.concurrent.ConcurrentLinkedQueue; 
import java.util.ArrayList; 

public class MessageBusImpl implements MessageBus { 

    private ConcurrentHashMap<String , ConcurrentLinkedQueue<Message>> allQueues = new ConcurrentHashMap<>(); // Mapping from a microService name to it's message-queue 
    private ConcurrentHashMap<Message, ArrayList<ConcurrentLinkedQueue<Message>>> messageTypeToSubsribers = new ConcurrentHashMap<>(); // Mapping from a message type to an ArrayList of the message-queues which are subscribed to it  

    @Override // make MicroService @m a subscriber of Request @type 
    public void subscribeRequest(Class<? extends Request> type, MicroService m) { 
     allQueues.get(m.getName()).add(type); 

    } 

答えて

4

単純に動作しません。あなたが使用しているジェネリックタイプは、

private ConcurrentHashMap<String , ConcurrentLinkedQueue<Message>> allQueues 

です。したがって、文字列キーとキュー値を使用したマップです。しかし、その後、あなたがこのように

allQueues.get(m.getName()).add(type); // where type is Class<? extends Request> 

を追加しようとしている:コンパイラは、あなただけメッセージオブジェクトを受け取り、キューにクラスオブジェクトを追加できないことを言っています!

ロングストーリーショート:コンパイラのメッセージを読んでください。一歩前に戻って、あなたがしたいことを正確に理解してください。あなたのように:なぜあなたはクラスのキューに追加したいのですかメッセージ

また、そのコードでのバグの可能性がある:あなたのget()はnullをを返すときに何が起こるか...そこに呼んで?!あなたはすでにという特定の名前のキューを作成したことをどうやって確認していますか?

1

メッセージのインスタンスを追加しようとしていないために、リクエストを拡張するクラスを追加しているために表示される問題があります。 Class<? extends Request>ではなくRequestインスタンスを受け入れるようにsubscribeRequest(...)を更新する場合は、コンパイルされていると思います。