1

私はEclipseRCPプロジェクトを「継承」しました。これは、3.6をベースにしたターゲットプラットフォームセットで正常に機能するようです。ただし、今後はプラットフォームの最新バージョンに更新する必要がありますが、ターゲットプラットフォームを3.7(または4.2)に変更すると、次のようなエラーが発生します。

Type mismatch: cannot convert from Class<capture#1-of ?> to Class<? extends IDatasetProvider>

誰かがこれが3.6ではうまくいくかもしれないが3.7(そしてそれ以降)ではうまくいかない理由の説明を提案/提供できますか?これを解決するためにどこから始めればよいかについてのアイデアも素晴らしいでしょう!

このエラーの原因となるコードのスニペット(b.loadClassの部分に表示されます):

    List<Class<? extends IDatasetProvider>> list = new LinkedList<Class<? extends IDatasetProvider>>();
    ClassMap<IDatasetProvider, List<String>> map = new ClassMap<IDatasetProvider, List<String>>();

    for (IConfigurationElement e : elements)
    {
        try
        {
            Bundle b = Platform.getBundle(e.getContributor().getName());

            String viewId = e.getAttribute("viewId");
            Class<? extends IDatasetProvider> datasetType = b.loadClass(e
                    .getAttribute("datasetProvider"));
            ...
            ...
            ...
        }
     }

3つの(おそらく)関連する警告もあります

 IDatasetProvider is a raw type. References to generic type IDatasetProvider<T> should be parameterized 

3.6プラットフォームに戻すと、すべてが再び機能します。

編集:Alexyとgzukminの助けを借りて修正しました。

Class<? extends IDatasetProvider>私は次のコードを使用しました。具体的には、単にではなくにキャストしますClass

Class<? extends IDatasetProvider> datasetType = 
    (Class<? extends IDatasetProvider>) b.loadClass(e.getAttribute("datasetProvider"));

より一般的なものにキャストすることを検討する必要がある理由がある場合はClass、私に知らせてください!

4

1 に答える 1

5

次のようにrawタイプにキャストできます。

Class<? extends IDatasetProvider> datasetType = 
    (Class) b.loadClass(e.getAttribute("datasetProvider"));

これは次のことに注意してください。

  1. 生のタイプとチェックされていないキャストに関する警告をさらに追加します。

  2. クラスが実際に拡張されていないことが判明した場合は、実行時に爆発しますIDatasetProvider。そして、キャストの場所ではなく、後で実際にクラスを使用しようとしたときに。したがって、これを確認することをお勧めします

    IDatasetProvider.class.isAssignableFrom(datasetType)
    

Javadocを参照)。

于 2012-07-06T17:29:53.747 に答える