![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
教えてください。
以下のような構文がありました。
Glassと中身のJuiceの関係性は何でしょうか?
ジェネリクスというのがありますが、
そもそもジェネリクスをつかうメリットは何でしょうか?
いくつかキャストしなくていいとかメリット書いてありましたが、
それよりも何でしょうか?
Glassのメソッドを汎用的に使えるからなのでしょうか?
public class Guest {
public static void main(String[] args) {
Glass<Juice> glass = new Glass<Juice>();
Juice juice = new Juice();
glass.liquid = juice;
Juice j = glass.liquid; // Why is this approach needed?
j.show();
juice.show(); // When we can call it directly here.
}
}
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
もうちょっと堅い説明をすると
ジェネリックとはアルゴリズムと型を組み合わせることを
可能にすること。
ジェネリックが無いと、様々な型で使用可能なアルゴリズムでも
型が違うとそれぞれの型別にソースを作成する必要が有りました。
そのため、ソースコードの型部分をプレースホルダにして
型に応じたソースを製造するマクロ言語とジェネレータなども
考案されたりしました。
そうした機能を言語自身が持つようになったのが
ジェネリックです。
No.3
- 回答日時:
ちょっとかみ砕くと
我々が java のプログラムを書くとき、変数の型を 全部
Object 型にしたりしないですよね。
Object 型ならどんなデータも格納できるのだけど、
具体的にどんなデータが入っているか一見して
わからないし、キャストしないと何もできません。
全てのコードをキャストまみれなコーディングに
したくはないですよね?
Java1.4 までは ArrayList などが格納できるデータ型は
Object のみでした。もしもっと格納できる型が具体的な
ArrayList が欲しいなら、ひとつひととつ作るしかありませんでした。
そうした努力を怠ると結局コードがキャストまみれになりました。
これは 変数の型を 全部 Object型にする状況と似てます。
javaに慣れてくればコレクションを多用するようになるのは
自然の流れですが、昔はコレクションの吐くObject型と
戦うのが大変でした。
しかしジェネリックの登場で、String専用の ArrayList は
ArayList<String> と宣言するだけで良くなりました。
これでキャストが不要になり、実行時にしか検出できなかった
型のエラーがコンパイル時に検出できるようになりました。
これってとるに足らないことですか?
No.2
- 回答日時:
Java ジェネリクスの実態はキャスト自動化だけなのですが、
これによりコンパイル時の型チェックが厳密になり、
バグによる実行時エラーを低減できるのが主なメリットとなります。
// コップは液体という情報を持っている。液体は酒でも果汁でもよい
class Glass<T> { public T liquid; }
// コップを一つ用意して、液体として果汁を入れる
var aGlass = new Glass<?>();
aGlass.liquid = new Alcohol(); // バグにより酒を入れてしまった
Juice j = (Juice)aGlass.liquid; // キャスト失敗の実行時エラー発生
// "果汁専用のコップ"を一つ用意して、液体として果汁を入れる
var jGlass = new Glass<Juice>();
jGlass.liquid = new Alcohol(); // 果汁でないのでコンパイルエラー発生
Juice j = jGlass.liquid; // 実行時にキャスト失敗しない
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
環境変数設定で
-
eclipseでスタックサイズを変更...
-
split関数で区切り文字がない場合
-
Javaで年月の取得(YYYYMM形式で)
-
「ワークスペースをビルド中」...
-
コミット前の更新データをチェ...
-
JUnit コードカバレッジについて
-
NoClassDefFoundError: javax/m...
-
Javascriptの値をJava(JSP)へ渡...
-
java 外部プログラムの実行
-
Eclipseで実行できてコマンドプ...
-
バイナリーコードと、ソースコ...
-
eclipseで「サーバーで実行」表...
-
Eclipseでのデバック
-
オーバーライドとは?
-
Struts2でアプリが実行できません
-
[JAVA]evalで文字列を計算式に!
-
JAVAにのeclipseに関する質問で...
-
JDK .jarファイルの実行環境に...
-
Eclipse(JAVA)のデバッグで他...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
split関数で区切り文字がない場合
-
eclipseでスタックサイズを変更...
-
Javascriptの値をJava(JSP)へ渡...
-
「ワークスペースをビルド中」...
-
Eclipse(JAVA)のデバッグで他...
-
JAVAにのeclipseに関する質問で...
-
Javaで年月の取得(YYYYMM形式で)
-
jasper.exceptionとは?
-
コミット前の更新データをチェ...
-
eclipseのjavaを実行できない
-
環境変数設定で
-
エクリプスで実行時、最新クラ...
-
Eclipseで実行>Javaアプリケー...
-
eclipseで「サーバーで実行」表...
-
バイナリーコードと、ソースコ...
-
NoClassDefFoundError: javax/m...
-
Eclipse 実行→Javaアプリケー...
-
Struts2でアプリが実行できません
-
Javascriptのパーミッション
-
javacでStackOverflowError
おすすめ情報