- ベストアンサー
プリミティブ以外のデータ型が分からないので教えて
class ★★<Object, Integer, List<■■>> ・この時、List<■■>のデータ型を何と呼ぶのでしょうか? (配列型? クラス型? ユーザー定義型? それ以外?) ・「ジェネリクスで指定できる型」と「普通に指定できる型」に違いはありますか? (ジェネリクスでしか指定できない、みたいな型はある?) ・「List<データ型>」の「データ型」として指定できる内容には、どんなものがあるのでしょうか? (ユーザー定義クラス?)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> ・不要と思って省略して質問したのですが 略したら意味をなさなくなるのに、どうして不要と思ってしまったのでしょうか。 > ・この書き方だったらできるでしょうか?(クラス宣言時の< >と、インターフェイスの< >は意味が違う?) > ・public class ★★ extends ○○<Object, Integer, List<■■>> ジェネリクスクラス○○<Object, Integer, List<■■>>を継承(extends)して★★クラスを宣言することは可能です。 しかし、「クラス宣言時の< >と、インターフェイスの< >は意味が違う?」の疑問文は、何と何を比較しているのかが分かりません。インターフェイスという話はどこから出てきたのやら。 public class ★★<T> { (定義は省略) } public interface ☆☆<S> { (定義は省略) } このクラス宣言とインターフェイス宣言で、<T>と<S>の間には特に意味の違いはないと思います。ここでTとSはどちらも型パラメータ。 > >型を「ジェネリクスで指定」とはどのような状況のことを指していますか? > ・インターフェイスの< >などで指定している型の意味で質問しました これを読んでも、元の質問である「「ジェネリクスで指定できる型」と「普通に指定できる型」に違いはありますか?」の意味が分かりません。 それぞれについて「こういう構文のここに書く型指定」という具体例を挙げることはできませんか? > ・「リスト」「配列」の違いは、生成時にサイズを決める必要があるか、でしょうか? 使い勝手という点では、それが一番大きな違いでしょうね。言語仕様および実装の観点からは他にもいろいろ違いますし、この文脈でなぜそれを聞くのかも謎ですが。 > ・List<MyClass>の意味は、リストの中身が全て「MyClass」のインスタンスという意味でしょうか? もしくは「MyClass」のメンバ? List<MyClass>は、その要素が全てMyClass型である(MyClassのインスタンス、MyClassのサブクラスのインスタンス、null)ことが保証されているListです。 MyClassのメンバという発想がどこから出てくるのかが分かりません。 > ・List<List<String>[]>の意味は、リストの中身が必ず文字列型の配列、ということでしょうか? 一段階足りていません。List<String>をXと呼ぶことにすると、List<List<String>[]>は、その要素が全て「Xの配列」であるListです。要素が全て「文字列型の配列」でであるListではありません。
その他の回答 (1)
- salsberry
- ベストアンサー率69% (495/711)
> class ★★<Object, Integer, List<■■>> クラスの宣言ではこのような書き方はできないと思います。クラス宣言時に< >の中に書けるのは型パラメータであって、具体的な型ではありません。 > ・この時、List<■■>のデータ型を何と呼ぶのでしょうか? > (配列型? クラス型? ユーザー定義型? それ以外?) 上のような書き方はありませんが、その点をおいておくとList<■■>はクラス型、もっと言えばジェネリクスクラス型でしょう。 Javaにおける配列というのは[ ]を使ってその要素にアクセスできるものなのでList<■■>は配列ではあり得ません。また、ユーザー定義型かどうかとジェネリクスクラスは直交する概念です。 > ・「ジェネリクスで指定できる型」と「普通に指定できる型」に違いはありますか? > (ジェネリクスでしか指定できない、みたいな型はある?) 型を「ジェネリクスで指定」とはどのような状況のことを指していますか? > ・「List<データ型>」の「データ型」として指定できる内容には、どんなものがあるのでしょうか? > (ユーザー定義クラス?) 参照型であれば何でも。ユーザー定義かどうかは問いません。 Listがjava.util.Listのことだとして、List<Object>もList<MyClass>もList<List<String>[]>も可能です。
補足
回答ありがとうございました。 >クラスの宣言ではこのような書き方はできないと思います ・不要と思って省略して質問したのですが、実際には下記のようになっていました ・この書き方だったらできるでしょうか?(クラス宣言時の< >と、インターフェイスの< >は意味が違う?) ・public class ★★ extends ○○<Object, Integer, List<■■>> >クラス宣言時に< >の中に書けるのは型パラメータであって、具体的な型ではありません ・型パラメータ=型変数(Tなど)でしょうか? >型を「ジェネリクスで指定」とはどのような状況のことを指していますか? ・インターフェイスの< >などで指定している型の意味で質問しました >Listがjava.util.Listのことだとして、List<Object>もList<MyClass>もList<List<String>[]>も可能です ・「リスト」「配列」の違いは、生成時にサイズを決める必要があるか、でしょうか? ・List<List<String>[]>の意味は、リストの中身が必ず文字列型の配列、ということでしょうか? ・List<MyClass>の意味は、リストの中身が全て「MyClass」のインスタンスという意味でしょうか? もしくは「MyClass」のメンバ?
お礼
回答ありがとうございました ・今回一番知りたかった内容は、下記でした >List<MyClass>は、その要素が全てMyClass型である(MyClassのインスタンス、MyClassのサブクラスのインスタンス、null)ことが保証されているList ・質問内容とズレていますが、最初の回答を読んだとき初めて、自分が知りたいことに気が付きました ・インターフェイスの件は、こちらの勘違いです ・また、ジェネリクスの件は、再度勉強して、それでも分からなければ改めて質問したいと思います ・疑問に丁寧に回答いただいたので、大変参考になりましたー