1

以下は私のインターフェース定義です

interface IStorage {
   <T extends ICommon> Collection<T> find(String name, boolean isExact);
}

そしてこれが実装です

Storage implements IStorage {
    Collection<IOrganization> find(String name, boolean isExact) {
       //some code
    }
}

IOrganizationはICommonのサブタイプです。

まだチェックされていない変換警告が表示されるのはなぜですか?

4

4 に答える 4

3

あなたがそれを書いたようにあなたのインターフェースはそれが拡張する何かfind()のを返すことCollectionを指定しているからですICommon

実装はCollection、の特定のサブクラスのを返しICommonます。コンパイラーが知る限り、これはチェックされていない変換です。Collection実際に他のサブクラスが含まれているとどうなりICommonますか?

于 2011-12-27T04:28:51.310 に答える
1

インターフェイスの目的が、String name, boolean isExactそのクライアントの引数を使用してfindメソッドを定義することである場合、返される特定の要素を知ることができますICommon(たとえば、クライアントが、Collection<IOrganization>ではなくを取得できるようにするとCollection<? extends ICommon>、インターフェイスのシグネチャは次のようになります。

interface IStorage<T extends ICommon> {
Collection<T> find(String name, boolean isExact);
}

その後、実装は次のように変更されます。

class Storage implements IStorage<IOrganization> {
Collection<IOrganization> find(String name, boolean isExact) {
return null; // whatever you would return.
}
}

これは、findメソッドを介して返される特定の型を宣言するインターフェイスを定義したという点で異なりますが、以前は、ICommonの型または不明なサブ型が返されたとしか言えないため、 ICollectionにキャストすると、コンパイラは常にこれを実行できることを確認できませんでした(ICollectionではない実装を指定した場合、実行時にClassCastExceptionが発生する可能性があります)。

于 2011-12-27T05:34:26.627 に答える
0

Storageメソッドをまだ定義しているfind(そしてメソッドを使用していない)ため、定義する間は同じ署名を保持します。

Storage implements IStorage {
    <T extends ICommon> Collection<T> find(String name, boolean isExact) {
       //some code
    }
}

そのジェネリックメソッドを実際に呼び出すときに、具象型パラメーターを指定します。

Storage s = new Storage();
s.<IOrganization>find("hello world", true);

ただし、ジェネリックメソッドでT導入するパラメータタイプ<T extends ICommon>は、パラメータリストにないため、役に立ちません。

おそらくあなたが望むのは一般的な方法ではないかもしれません。しかし、次のようなものです。

interface IStorage {
    public Collection<? extends ICommon> find(String name, boolean isExact);
}

//and
class Storage implements IStorage {
    public Collection<IOrganization> find(String name, boolean isExact) {
        //some code                
    }
}

//or 
class Storage implements IStorage {
    public Collection<? extends ICommon> find(String name, boolean isExact) {
        //some code  
    }
}
于 2011-12-27T04:38:45.493 に答える
0

のようなジェネリック メソッドがある場合<T extends ICommon> Collection<T> find(...、呼び出し元は T を好きなように要求できることを意味します。これは、メソッドが特定の T を選択できるのではなく、そのような型 T で動作する必要があることを意味します (やりたいこと)。実証するために、ジェネリック メソッドにより、呼び出し元は次のように言うことができます。

IStorage obj = ...;
Collection<SomeRandomClassImplementingICommon> foo = obj.find(...);

ただし、Collection<IOrganization> find(...type を返さないため、メソッドは上記と互換性がありませんCollection<SomeRandomClassImplementingICommon>

于 2011-12-27T07:37:14.777 に答える