5

このC#宣言に相当するJavaは何ですか?

public class AsyncThreadPool<T, K> where T : IAsyncThread<K> {

IAsyncThreadインターフェースです

public interface IAsyncThread<T> 
{
    T GetAsyncUsedObject(); 
    void StartAsyncRequest();    
}

私が試してみました :

public class AsyncThreadPool<T extends IAsyncThread<K>, K  >

しかし、Tの実装はそれを拡張しないため、正しくありませんIAsyncThread<K>

そして、私はこのクラスで使用する必要がありT.StartAsyncRequest()ます

C#では次のようになります。

T asyncThread = default(T);
asyncThread.StartAsyncRequest()
4

3 に答える 3

10

extendsJavaのジェネリック制約には、との2つのオプションしかsuperなく、その場合、拡張と実装の間に違いはありません。メソッド宣言コードはそのまま機能するはずです。

インスタンス化するには、のクラスを使用しTて作成するパターンを実行する必要があります。を直接使用することはできないためT.class、作成パターンの再利用性が必要な場合は、corsiKaが提案するようにファクトリを作成するかClass<T>、クラスのコンストラクターにを渡してそのインスタンスを保持することができます。

public class AsyncThreadPool<T extends IAsyncThread<K>, K>{ 
    private final Class<T> clazz;
    public AsyncThreadPool(Class<T> clazz){
        this.clazz = clazz;
    }       
    public void Start() throws InstantiationException, IllegalAccessException{          
        T instance = clazz.newInstance();
        instance.StartAsyncRequest();
    }
}

default(T)また、C#では、クラスまたはインターフェイスに使用するとnull参照が生成されるため、元の例が正しくないことに注意することも重要です。

于 2012-08-10T15:11:38.967 に答える
5

あなた <T extends IAsyncThread<K>>は正しいです。クラス自体はextendsではなく実装しますが、一般的な定義の用語はextendsです。<T extends Object & IAsyncThread<K>>必要に応じて、またはを使用できますが、<T extends Object, IAsyncThread<K>>不要です。

タイプTのメンバーを作成する場合、実際に自由に使用できるのは、ファクトリオブジェクトを使用することだけです。

public class AsyncThreadPool<T extends IAsyncThread<K>, K> {
    private final AsyncThreadFactory<T> factory;
    public ASyncThreadPool(AsyncThreadFactory<T> factory) {
        this.factory = factory;
    }
    public void foo() {
        T t = factory.createDefault();
        t.startAsyncRequest();
    }
}
于 2012-08-10T15:13:32.747 に答える
2

あなたのコードはうまくいくはずです:

public class AsyncThreadPool<T extends IAsyncThread<K>, K  >

ジェネリックスでextendsは、拡張または実装を意味する場合があります。

于 2012-08-10T15:12:55.160 に答える