2011-12-26 15 views
1

なぜ次のコードはコンパイルされませんか?汎用クラスのコンパイルエラー

class aa1 <String> { 
public void fun(){ 
String s = ""; // not compiling 
} 
} 
class aa2 <String> { 
String s = ""; // not compiling 
} 
class aa3 <String> { 
String s = (String)""; // compiling 
} 

は、いくつかは教えてくれたり、私にこの 感謝のリンクを与えることができます。

+1

コンパイルエラーメッセージが表示されない場合は、いくつかのヒントを教えてください。 –

答えて

2

この場合、ジェネリックパラメータ "String"はjava.lang.Stringを非表示にします。

クラス内で、文字列sを宣言し、そのデータ型を "java.lang.String"と指定すると、コンパイラは不平を言わないでしょう。

public class aa<String> { 

    java.lang.String s = "" ; 

} 
0

一般的なパラメータ名(String)はjava.lang.Stringタイプを隠しているようです。

汎用パラメータの名前を変更することをおすすめします。ちなみに、あなたのsにはどのタイプがありますか:java.lang.Stringか、それとも?後者の場合、コンパイラが""(タイプはjava.lang.String)を、汎用パラメータで表される潜在的に関係のない型に割り当てる方法はありますか?

0

この例では、識別子としてStringと宣言しています。キーワードやタイプ名は使用しないでください。 (Generics Tutorial)。

+0

でも、3種目のキャスティングでコンパイルしていますか? – user460293

+0

@ user460293 - 警告とともにコンパイルされます。その警告を読むと正しい答えが得られます。 – adatapost

6

ジェネリックの背後にあるアイデアを誤解している可能性があります。ポイントはあなたのクラス(aa、この場合)は...まあ、一般的なことができるということです。 1つの固定型ではなく、多態性によって任意の数の型にすることができます。ジェネリック型は変数名に似ていますが、クラスのインスタンスではなくクラスを表します。

class aa <T> { 
    public void fun(T myObject){ 
     T s = myObject; 
    } 
} 

これはジェネリックの適切な使い方です。 Tは単に「何らかのクラス」を表しています。 投稿した例が、という文字列の可視性をオーバーライドしたためにコンパイルされなかった理由(java.lang.Stringではなくジェネリック型になっています)。あなたはそれがどんなクラスが、クラスのサブセットにしたくない場合は、あなたが何か行うことができます。この場合

class aa <T extends MyInterface> { 
    public void fun(T myObject){ 
     T s = myObject; 
    } 
} 

を、あなたはクラスTのインスタンスはまた、インターフェイスを拡張することを保証していますMyInterface。ただし、最終的なのでStringを拡張することはできません。 Stringオブジェクトが設定されるためにあなたが望んでいたすべてだった場合は、すべてのジェネリックを必要としない:

class aa { 
    public void fun(){ 
     String s = ""; 
    } 
} 

をジェネリックの詳細については、オーバーthe Java tutorials on genericsをお読みください。

0

あなたのコードは、タイピングのようなものです、デフォルトjava.lang.Stringタイプを上書きしますジェネリック型Stringを、宣言しているので:

class aa<T> { 
    T s = ""; 
} 

Tは、単純型消去後Objectですが、それは初期化することができるので、何か(例えばInteger)を指定した場合、コンパイラはStringを割り当てません。

1

あなたのコードは意味をなさない - 宣言は意味をなさない - あなたは本当にここで何をしようとしていますか?

コンパイル時に問題が発生するのは、JDKのjava.lang.Stringを隠しているジェネリック宣言を作成しているからです。

また、同じクラスを3回宣言しています。このようなものはコンパイルされますが、おそらくあなたが望むものを達成できないでしょう。

class aa<NotString> { 
    public void fun() { 
     String s = ""; // compiles 
    } 
} 

class aa2<NotString> { 
    String s = ""; // compiles 
} 

class aa3<NotString> { 
    String s = (String) ""; // compiling 
} 
関連する問題