2011-11-14 14 views
9

Javaの(コマンドライン)コンパイラからではなく、Eclipseのコンパイラから正常にコンパイルして機能するジェネリックを使用してGuiceバインディング・コードを使用しています。最新(1.7.0_01)のJava SDKにアップグレードしましたが、引き続き次のエラーが発生します。Javaジェネリック・エラー:コマンドライン・コンパイラからの互換性のないタイプ

[error] ...\BindCategorySelectorActivity.java:42: error: inconvertible types 
[error]         (Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>>) CategoryDataProvider.class); 
[error]                               ^
[error] required: Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>> 
[error] found: Class<CategoryDataProvider> 
[error] 1 error 
[error] {file:/.../compile:compile: javac returned nonzero exit code 

関連するコード:

public interface Category extends DatabaseItem {} 
public class CategoryDataProvider implements 
ListAdapterDataProvider<Row<Category>> {} 
public class BindListViewHandlerWithSpecificProvider extends AbstractModule { 
    public BindListViewHandlerWithSpecificProvider(
    Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>> 
     dataProviderClass) {} 
} 

@SuppressWarnings("unchecked") 
// Error happens here: 
final BindListViewHandlerWithSpecificProvider 
bindListViewHandlerWithSpecificProvider = 
    new BindListViewHandlerWithSpecificProvider(
    (Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>>) 
    CategoryDataProvider.class); 

答えて

6

が自分に好意を行うと意気消沈続いアップキャストを実行します。

Class<...> foo = (Class<...>)(Object)MyClass.class; 

問題は、CDP.classはタイプClass<CDP>であるということであるCDPがあること生の種類。パラメータ化されたタイプC<T1,...,Tn>は生タイプC(§4.10.2)のサブタイプですが、逆は真ではありません。CC<T1,...,Tn>のサブタイプではありません。これは、チェックされていない変換(5.1.9)のためにのみ当てはまります。これにより問題が発生しています。が「拡張」(Class<? extends ...>の上限)LADP<Row<? extends DI>>と予想されます。これは、型引数包含(§4.5.1.1)がサブタイプに対して定義されており、チェックされていない変換は考慮されていないためです。

(または、本題にする:javacは、このいずれかの権利を持っている)

+0

まあ、それはコンパイルするために管理が、私はもしわからないが戻しますオブジェクトに余分なキャストを追加するだけで問題が隠されました。 Guiceはバインドしようとするとnullポインタ例外が発生してクラッシュします。そのレポートが 'bindListViewHandlerWithSpecificProvider'にアクセスしている行です。そして、この同じコードは、Eclipse内でビルドされるとエラーなしでコンパイルされ、実行されます。 –

+1

私はそれが好奇心の行動だと認めます。 Objectへの余分なキャストを行うと、sideCastからjavacを欺くこと以外に何もしません。あなたは効果的に同じプログラムで終わるべきです。 –

+0

Guiceがジェネリックのサポートを追加したことや、パラメータ化された型を渡すためのより良いメカニズムがあることに精通していますか? Scalaがパラメータ化された型を渡すためのより良いサポートを提供するかどうか? –

1

私は答えが働いて、受け入れられている知っているが、私はダウンキャストは完璧なソリューションではありません信じています。また、私のコードのクリーンアップは、廃止されたダウンキャストを削除します...

1)理由は、Eclipseとコマンドラインは、Eclipseの設定のために同じ問題を生じません。 preferences - java - compiler - Errors/Warningsに行き、Generic types(未チェックジェネリック型操作)を警告に設定します。 @SuppressWarnings("unchecked")

2)私も同様の問題があり、友人が別の解決方法を示しています。 (ダウンキャストせずに)適切にコードを修正するには、単にこれにCategoryDataProvider.classを変更します。

new CategoryDataProvider<Row<DatabaseItem>>().getClass() 

はその後 @SuppressWarnings("unchecked")

+0

このメソッドは、クラス(この場合はCategoryDataProvider)にデフォルトのコンストラクタがある場合にのみ機能します。より複雑な場合、この方法ではクラスを回復するだけで多くの準備と初期化が必要になることがあります。 –

関連する問題