2012-09-27 4 views
5

のサブクラスであることを、一般的な必要:Javaのジェネリック:私は抽象ジェネリッククラスを持っている特定のタイプ

public abstract class AbstractMessageHandler<T extends AbstractMessageHandler> 
{ 
    public abstract List<String> getTypesOfMessages(); 
    public abstract void handleMessage(String message, CometClient client); 

    public T setResponseValues(AbstractMessage request, T response) 
    { 
     response.setCompanyId(request.getCompanyId()); 
     response.setMessageGroup(request.getMessageGroup()); 
     response.setUserId(request.getUserId()); 
     response.setTimeStamp(AbstractMessage.getCurrentTimeStamp()); 

     return response; 
    } 
} 

私はこのクラスのサブクラスであることを、一般的なサブクラスを必要とします。つまり、ジェネリックはAbstractMessageHandlerのサブクラスでなければなりません。しかし、これは私にコンパイルの問題を与える。誰でも私が間違っていることを知らせることはできますか?

おかげであなたが例えば<T extends SomeClass>

を行うことができ、あなたの一般的な定義では

+0

コンパイラエラーをポストします。そして、うまくいけば、 'AbstractMessageHandler'が理論的に実装している' interface'のジェネリックサブクラス 'T'を必要としたいだけです。これは' MessageHandler'という名前です。関連して、 'setResponseValues'は' AbstractMessage'ではなく 'Message'をパラメータとして取るべきでしょう。これらは、実装している「インタフェース」がない場合を除き、不必要に要件を制限しています。 – pickypg

+0

コンテキストがなければ、タイプ制約内のAbstractMessageHandler自体に型引数が必要であると思います。これがあなたの問題に最適なデザインだと確信していますか? "AbstractMessageHandler ? –

答えて

7

:クラスは、一般的なようにする必要性があるかのように与えられたコードから

public abstract class AbstractMessageHandler<T extends AbstractMessageHandler<T>> 
+0

私は同意しません。彼が与えたコードでは、 '> 'の上で、これの型の利点はありません。いずれにしても、 'Enum'のサブクラスは言語によって作成され、それら自身の正確なジェネリックパラメータで' Enum'のサブクラス化が強制されるため、 'Enum'は特別なケースです。他の状況には当てはまらない。他の状況でそれを強制することはできません。 – newacct

+0

@newacct - 実際は可能です。それを試しましたか?これは実際には非常に便利なパターンです。私は私のコードでそれを使用したので、私はそれが動作することを知っている。 – jtahlborn

+0

'Class Foo extends AbstractMessageHandler {...}'なら 'class Bar extends AbstractMessageHandler {...}'にすることができます。だから本当にこれは縛られているのですか? – newacct

0

Tは、いくつかのResponseクラスを拡張し、ないAbstractMessageHandlerなければならないようなあなたの場合には

abstract class Processor<T extends String> { 
    abstract T process(); 
} 

、それが見えます。あなたが列挙型クラスの例に従う必要が

+1

注:彼は最初の行にあります。彼は他のいくつかの問題にぶつかっている。 – pickypg

+0

ええ、彼は私がそれを書いている間にそれを加えました。 –

0

を、それはいないようです。代わりに、一般的な方法(あなたがすべてで現在のオブジェクトを使用する必要があると思われないよう、私も、それは静的作った)について、どのように:

public abstract class AbstractMessageHandler 
{ 
    public static <T extends AbstractMessageHandler> T setResponseValues(AbstractMessage request, T response) 
    { 
     response.setCompanyId(request.getCompanyId()); 
     response.setMessageGroup(request.getMessageGroup()); 
     response.setUserId(request.getUserId()); 
     response.setTimeStamp(AbstractMessage.getCurrentTimeStamp()); 

     return response; 
    } 
} 

あるいは、より良い、ちょうどAbstractMessageHandler上のメソッドを定義します現在のオブジェクトで動作する。次に、この静的メソッドは必要ありません。また、常に返されるこの奇妙なパラメータはありません。

public abstract class AbstractMessageHandler 
{ 
    public void setResponseValues(AbstractMessage request) 
    { 
     setCompanyId(request.getCompanyId()); 
     setMessageGroup(request.getMessageGroup()); 
     setUserId(request.getUserId()); 
     setTimeStamp(AbstractMessage.getCurrentTimeStamp()); 
    } 
} 
関連する問題