memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

ChatGPTやGeminiでは最近のJavaの情報は学習対象になっていないのだろうか?

火曜日はゼミ科目が多い日です。ゼミといっても4年ではなく2、3年も少人数授業がありそれらもゼミ科目と呼んでいます。

で。

先週、福岡市のIT企業のインターンシップで授業を休んだ2年生に「どうだった?」と聞いてみると、なかなか面白い企業があることを教えてもらいました。

20年近く福岡で学生らの就職活動に間接的ですが関わってきたはずですが、その名の企業は知りませんでした。

その会社のHPを見ていると主要言語がいくつか挙げられていて、その中にJavaがありました。こういうシステムもまだまだあるよな。。。と思いながら。

以前はJavaを導入言語としてた時期もありましたが、ここ10年くらい使っていませんし情報も追ってませんでした。

Javaの本でもざーっと読んでみようとオライリーを検索すると昔からあるコアJavaが見つかりました。日本語に翻訳して読み始めてみました。

learning.oreilly.com

最初のコードが以下でした。

/**
 * This program displays a greeting for the reader.
 */
void main() {
    String greeting = "Welcome to Core Java!";
    IO.println(greeting);
    IO.println("=".repeat(greeting.length()));
}

クラス書かなくてもいいんだ。。。しかもimport書かなくてもIOだけでprintlnできるんだ。。。とか。色々変わっているのね。。。って。使わないけど知っておかないとなぁ。。。と思って読み進めようとしましたが。

ちょっと、このIOってのが気になりました。何かしらの機能強化でこうなったのだと思いますし、その名称も知りたいと思ったのです。ドキュメントひっくり返すの面倒だしな。。。と思い、ChatGPTに聞いてみました。この答えが面白くてこのエントリーを書いています。しょうもないことですが。。。やりとりが長いのでChatGPTの解答は要点だけ書きますね。

Javaの本を読んでいると以下のようにIOからはじまってprint文がかけるようですが、昔はなかったと思います。これはどうしてこんなことができるのですか?

void main() {
    IO.println("「Hello, World!」は使用しません");
}

ChatGPT

そのコードは 「Java 本が独自に用意した教育用ライブラリ」 を使っているために動きます。
結論としては、
- Java 標準には IO.println なんて存在しない。
- 本の著者が“初心者向けに簡略化した独自クラス”を作っている。
ということです。

僕の10年くらの前の知識なら確かにそうだなと思いますが、それから10年も経ってますし。。。そりゃないだろうと思いました。で、以下のように尋ねました。

うそだー。何も読み込んでいない状態でjshellを起動して上記のコードを実行すると実行できるってことは標準機能だと思うのだが?

ChatGPT

結論から言います:
- Java 標準には IO というクラスは存在しません。
- jshell が最初から自動読み込みすることもありません。
- したがって IO.println が“素の jshell で動く”というのは、何か別の理由があるはずです。
つまり 本当に動いているなら、あなたの jshell 環境にすでに IO クラスが紛れ込んでいる ということです。

どうしても犯人が別にいると思いこんでいるようです。怖いですね。。。さらに。

jshellで「IO.class」っていれると「class java.lang.IO」って表示されたぜ?java.langってjavaの根幹のクラスだろ?

ChatGPT

それは ものすごく重要なヒント です。
class java.lang.IO
これは「java.lang パッケージに IO というクラスがある」という意味になりますが……

自分を正当化するために一生懸命になる可愛いヤツです。

ChatGPT

📌 つまり今回の真相はこれ
✔ jshell の中に 以前あなた(または教材)が定義した IO クラスが残っていた
✔ jshell はクラスを永続化するため、次の起動でも使えてしまった
✔ そのため “標準機能のように見えた”

もう埒が明かないので、Geminiに聞いてみました。

Javaの本を読んでいると以下のようにIOからはじまってprint文がかけるようですが、昔はなかったと思います。これはどうしてこんなことができるのですか?
void main() {
    IO.println("「Hello, World!」は使用しません");
}

Gemini

あなたが目にした IO.println() は、Javaの標準ライブラリではなく、その本や資料が提供する独自の便利機能(ユーティリティクラス)です。(略)

おまえもかーい。。。笑

Claudeに聞いてみました。

Claude

完璧です👍️

これ何でしょうね。。。Javaの周辺に関する学習データが古いまま、という可能性が考えられます。新しい情報を取り込まない選択をしたとも。たまたまランダムシードがそういう答えを選択したのかもしれませんが。。。

Claude Codeが優秀と言われる所以でしょうか。課金勢ではないので使ったことはありませんが。

Java リハビリしないとなぁ。。。使うことはないけど。

実用的にはプログラミング言語の良し悪しというより使い道があるかどうかなんですよね。。。Pythonが流行っているのはレバレッジが効くからであって。道具にすぎませんしね。。。道具に過ぎないのであれば好きな言語を使いたいですけどね。。。宗教になるのでここらへんで。

それにしてもjshell便利ですね。。。今日初めて知りました。こういうのがあったらなぁ。。。