質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

2回答

398閲覧

Javaのジェネリクスはなぜオブジェクト型しか入れられないのでしょう?

SkipEveryLunch

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2018/03/19 13:31

初心者です。
HashMapを利用していて、とても疑問に思うことがあります。
それは、

Java

1import java.util.*; 2 3class Main{ 4 public static void main(String[] args){ 5 Map<String,Integer> nameAndHeight=new HashMap<String,Integer>(); 6//クラスのみんなの名前と身長を入れる連想配列です 7 nameAndHeight.put("田中",172); 8 nameAndHeight.put("吉田",168); 9 nameAndHeight.put("野村",171); 10 nameAndHeight.put("ダレイオス三世",345); 11 System.out.println(nameAndHeight.get("野村")); 12//??? 13//なんで<String,Integer>なんでしょうね??? 14//<String,int>のほうが打ってて楽なんですけど 15 } 16}

どうして<>の中にはオブジェクト型しか入らないのだろう、という事でした。

調べてみると<>はジェネリクスと言う、
引数の型を限定しないまま型安全を保持できる機能で使われるようです。
しかし、ジェネリックの中には、やはりオブジェクト型しか入らないようです。

「これがHashMapにオブジェクト型しか入らない原因かぁ……」
と分かったものの、ではなぜジェネリクスにオブジェクト型しか入れられないのか
よくわかりません。
どなたかご教授下されば幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ジェネリクスがJava 5で入った、後付けの機能だということが要因です。

ジェネリクスの導入以前は、<>なしで、ArrayListとかHashMapだけで宣言して、要素はすべてObject型でした。Objectからの派生型の値を取り出す場合には、必ずキャストが必要でした。

Java 5でジェネリクスが登場しましたが、この型の割当てはあくまでソースコード上のものであって、従来との互換性の関係もあって、コンパイルした後にはObjectを扱うような形となります。ということで、ジェネリクスはObject派生の型にしか使えません。

投稿2018/03/19 13:51

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SkipEveryLunch

2018/03/19 14:44

ご回答ありがとうございます。 なるほど、歴史的な経緯によるものだったのですね。
guest

0

ベストアンサー

ジェネリクスは代入可能なデータ型の継承関係をチェックする仕組みです。
プリミティブ型は参照元となるルートクラス(つまりObject)がなく、継承関係がわからないため、ジェネリクスで扱う事ができないと覚えれば良いですね。

※例えば継承関係がチェックされる例としてList<? extends T>List<? super T>があります。

以下の記事が参考になるかと思います。
https://qiita.com/pebblip/items/1206f866980f2ff91e77

投稿2018/03/20 07:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SkipEveryLunch

2018/03/20 15:59

ご回答ありがとうございます。 ジェネリクスと継承のあいだに何らかの関係があるとは思いもしませんでしたが、グーグル検索すると次々にヒットが出ます。これだけでもしばらくは退屈しないくらい深いトピックのようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問