初めて自分の家と他人の家が違う、と意識した時

教えてください。
以下のような構文がありました。
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件)

もうちょっと堅い説明をすると


ジェネリックとはアルゴリズムと型を組み合わせることを
可能にすること。

ジェネリックが無いと、様々な型で使用可能なアルゴリズムでも
型が違うとそれぞれの型別にソースを作成する必要が有りました。
そのため、ソースコードの型部分をプレースホルダにして
型に応じたソースを製造するマクロ言語とジェネレータなども
考案されたりしました。

そうした機能を言語自身が持つようになったのが
ジェネリックです。
    • good
    • 0

ちょっとかみ砕くと



我々が java のプログラムを書くとき、変数の型を 全部
Object 型にしたりしないですよね。

Object 型ならどんなデータも格納できるのだけど、
具体的にどんなデータが入っているか一見して
わからないし、キャストしないと何もできません。

全てのコードをキャストまみれなコーディングに
したくはないですよね?

Java1.4 までは ArrayList などが格納できるデータ型は
Object のみでした。もしもっと格納できる型が具体的な
ArrayList が欲しいなら、ひとつひととつ作るしかありませんでした。
そうした努力を怠ると結局コードがキャストまみれになりました。

これは 変数の型を 全部 Object型にする状況と似てます。
javaに慣れてくればコレクションを多用するようになるのは
自然の流れですが、昔はコレクションの吐くObject型と
戦うのが大変でした。

しかしジェネリックの登場で、String専用の ArrayList は
ArayList<String> と宣言するだけで良くなりました。

これでキャストが不要になり、実行時にしか検出できなかった
型のエラーがコンパイル時に検出できるようになりました。

これってとるに足らないことですか?
    • good
    • 0

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; // 実行時にキャスト失敗しない
    • good
    • 0

List とか使ったことないのかな。



あれで型指定できなかったら困りません?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!