2009-08-24 17 views
5

のインタフェースの実装私はこのように、基本的に見えるクラスをしたいのですが:は汎用Javaのクラスを取得し、ジェネリック医薬品

public class MyClass<T implements Serializable) { 

    void function() { 
     Class c = T.class; 
    } 
} 

2つのエラー:
- 私はT.classを呼び出すことはできません、私は、他のオブジェクトタイプ
でそれを行うことができていても - 私はTが

どのように私は私の2つのジェネリック医薬品の問題を解決するのです。このように、Serializableを実装することを強制することはできませんか?これらの線に沿って

乾杯

ニック

+0

実際に達成したいことの例を追加できますか? – Zed

答えて

7

タイプを取得できません。

ジェネリックは、type-erasureと呼ばれるものを使用して実装されます。ジェネリック型がインスタンス化される

、 コンパイラは によってタイプ消去と呼ばれる手法これらの型を変換 - コンパイラは、クラス内のパラメータ と型引数を入力するために関連するすべての 情報を削除または プロセス方法。型消去は がジェネリック前に作成された Javaライブラリとアプリケーションとのバイナリ互換性を維持 にジェネリックを使用するJava アプリケーションを可能にします。

これの本質は、型情報がコンパイラによって使用され、破棄され、したがって実行時に利用できないということです。強制T implements Serializableに関して

、あなただけの、次のものが必要です

public class MyClass<T extends Serializable>) 
{ 
    public void function(T obj) 
    { 
    ... 
    } 
} 

これは単にを参照している関係、Serializableを実装ので、クラス、Serializableとすることができますされていますfunctionに渡されます。

+1

偉大な説明をお寄せいただきありがとうございます。私は今、なぜ動作しないのかを理解しており、gjrwebberが提案した回避策を使って私の実際的な問題を解決しました。本当にありがとう! :-) – niklassaers

3

何かがそれを行う必要があります。

private Class<T> dataType; 
Type type = getClass().getGenericSuperclass(); 
if (type instanceof ParameterizedType) { 
    ParameterizedType paramType = (ParameterizedType) type; 
    dataType = (Class<T>) paramType.getActualTypeArguments()[0]; 
} else if (type instanceof Class) { 
    dataType = (Class<T>) type; 
} 
+0

問題の解決に感謝して、私はこの問題を解決するのに役立ちました。他の答えは、私が問題を理解するのに役立ちました。 :-) 君たちは最高です! :-) – niklassaers

+5

sun.reflect.generics.reflectiveObjects.TypeVariableImplをjava.lang.Classにキャストできません。何が欠けていますか? –

1

javaは実行時にクラスTが実際に分からないため、T.classを実行できません。

コンパイル時にすべての情報が失われます。

はあなたのように、 functionに引数としてクラスオブジェクトを渡すために(あなたは1へのアクセス権を持っている場合)TのインスタンスではgetClass()を呼び出すか、ユーザーが必要とするかTのクラスオブジェクトを取得するには
void function(Class<T> c) 
+0

一般的な引数バウンディングの構文は、ではありません。

+0

Ah。私は答えのその部分を削除しました。 – sepp2k

+0

クイックフィードバックをありがとう。 (1)私のジェネリック関数では、T.classを入力パラメータとする関数を使いたいという問題があります。私がこのようにすることができないなら、それほど良い回避策はクラスTのオブジェクトをインスタンス化することですが、私はそれを理解しているので、再び型消去のために "新しいT()"と言うことはできませんか? (2)Doh、typoが見られませんでした。しかし、私のJavaコンパイラは、私が実装している部分をカンマで区切ることを期待していると主張しています。編集:ありがとうtkopec、はるかにうまく機能し、私はインターフェイスを拡張することができたかわからなかった – niklassaers

5

あなたはこれを行う:

public class MyClass<T implements Serializable) { 

    void function(Class<T> tc) { 
     ... 
    } 
} 

は基本的に、あなたはそれを見るためには、実行時にクラスに渡す必要があります。

public class MyClass<T implements Serializable) { 
    Class<T> ct; 
    public MyClass(Class<T> ct){this.ct = ct;} 

    void function() { 
     ... //you know what the class is here 
    } 
} 

これは厄介なものですが、全体的に面倒なことはありません。

+1

ありがとう、それはエレガントな回避策です:-) – niklassaers

+0

これは非常に単純で良い解決策です – satya

関連する問題