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

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

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

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

Q&A

1回答

973閲覧

運営消去リクエスト済み

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2022/02/19 14:36

編集2022/02/20 02:55

コメント欄に荒らし、誹謗中傷が確認できたため(通報済み)消去予定。
対象コメントはすでに消去されています

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

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

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

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

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

Zuishin

2022/02/19 14:51

問題の「オブジェクトクラス」というのがどれのことで、何が問題なのか、を明記した方が解決しやすいと思います。
jimbe

2022/02/19 17:13

もしや Comparable インターフェースの CompareTo メソッドのパラメータになっている Object クラスのことでしょうか。
m.ts10806

2022/02/19 20:11

コードの出典はどこでしょうか
退会済みユーザー

退会済みユーザー

2022/02/20 00:33

もしや Comparable インターフェースの CompareTo メソッドのパラメータになっている Object クラスのことでしょうか。 はい、そちらになります
Zuishin

2022/02/20 00:47

> オブジェクトクラスについて自分で調べてはおりますが、いまいちどのような場面で使えば良いのかイメージできません。 少なくとも、このような場面で使うべきではありません。 クソコードです。
Zuishin

2022/02/20 03:02 編集

この質問者、見たことありますね。
退会済みユーザー

退会済みユーザー

2022/02/20 02:30

コードの出典はどこでしょうか 回答欄のコメントに書かせて頂きました そちらをご覧下さい
m.ts10806

2022/02/20 02:31

質問本文に追記してください。
退会済みユーザー

退会済みユーザー

2022/02/20 02:41

(o^^o)
Zuishin

2022/02/20 02:56

荒らしは質問者以外にいませんね。
Zuishin

2022/02/20 02:57

このように何度もアカウントを取り直している人なんでしょう。
quickquip

2022/02/20 04:29 編集

経緯はどうあれ結果としては、質問者さんが一番の荒らしなので「質問を過去の時点に回復するべき」と運営に通報しておきましたが、どうなるか…
tako258

2022/02/21 00:03

ヌシ2人に絡まれてる笑
tae256

2023/06/27 11:23

それを言うためだけ態々アカウントをとってるのはすごい
guest

回答1

0

ベストアンサー

「オブジェクトクラス」というのがjimbeさんが指摘しているとおり「Comparable インターフェースのCompareTo メソッドのパラメータになっている Object クラスのこと」であるという前提で回答します。違っていれば、この回答は無視してください。

結論から言うとそのComparableの実装の仕方は大変古いです。どれぐらい古いかというと、17年ぐらい古いです。

2004年9月30日リリースされたJava 5(J2SE 5.0, 内部バージョンは1.5.0)で総称型(ジェネリクス)という機能が追加されました。Java 5より前は、質問のコードのように汎用的なソートプログラムと対応のインターフェースを作る場合、引数等にObject型を用いて内部でキャストするしかありませんでした。このObject型を使用する方法は実行時にキャストに失敗する(実行時エラーになる)可能性があるなど、プログラマー側に注意が必要なものでした。そこで新たに総称型という機能が追加されました。総合型を用いればキャストを必要とせず、型の不一致はコンパイル時にわかるようになります。総称型はJavaだけではなくC#等の他の言語でも採用されています。

総称型を用いて書き直すと下記のようになります。Objectとなっている部分が無くなっているのがわかると思います。キャストしていたところ((Person)obj)も無くなったので、実行時に型の不一致でエラーになる可能性も無くなり、より安全なコードになります。

Java

1public class Ex { 2 public static void main(String[] args) { 3 Person[] p = { 4 new Person("Ar", 26, 172), 5 new Person("Co", 40, 170), 6 new Person("Al", 37, 168), 7 new Person("Go", 21, 180), 8 }; 9 Baburu.sort(p); 10 for (int i = 0; i < p.length; i++) { 11 p[i].show(); 12 } 13 } 14}

Java

1public interface Comparable<T> { 2 int compareTo(T obj); 3}

Java

1class Person implements Comparable<Person> { 2 private String name; 3 private int age, height; 4 5 public Person(String name, int age, int height) { 6 this.name = name; 7 this.age = age; 8 this.height = height; 9 } 10 11 public void show() { 12 System.out.println(name + ":" + "age.." + age + ", height.." + height); 13 } 14 15 public int compareTo(Person obj) { return age - obj.age; } 16}

Java

1class Baburu { 2 public static <T extends Comparable<? super T>> void sort(T[] data) { 3 for (int i = data.length - 1; i > 0; i--) { 4 for (int j = 0; j < i; j++) { 5 if (data[j].compareTo(data[j + 1]) > 0) { 6 var work = data[j]; 7 data[j] = data[j + 1]; 8 data[j + 1] = work; 9 } 10 } 11 } 12 } 13}

最後に、書籍かサイトか何かを参考にされたのだと思いますが、総称型で書かれていない時点でその参考にされた物も大変古いため、捨てることを推奨します。Javaも進化しており、ラムダ式やvarやレコード等と言った機能が追加されています。これからJavaを学ぶのであれば、最新のLTSバージョンである17あたりをターゲットに学んだ方がいいかと思います。

投稿2022/02/20 00:50

raccy

総合スコア21735

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

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

退会済みユーザー

退会済みユーザー

2022/02/20 01:14

わかりやすい回答ありがとうございます。 まさかそんなに古いコードだとは思いませんでした。早速、総称型について勉強したいと思います。 今後、同じ参考書を手に取られる方のために詳細を記載します。 書名:基本情報技術者 試験対策テキストV「プログラミングJava言語編」 出版:TAC 2020年9月に発行第3版として発行されております。
退会済みユーザー

退会済みユーザー

2022/02/20 01:18

追加の質問になりますが 現在はObject型を使用する方法はほとんど使われていないという解釈でよろしいでしょうか?
raccy

2022/02/20 03:07

総称型が使えないような場合(どんな場合があるかはすぐに思いつきませんが)はObject型を使う必要かもしれませんが、Object型から目的の型へのキャスト(ダウンキャスト)が安全ではない(実行時エラーが起きる可能性がある)ので可能な限り使わないようにする傾向があります。 基本情報技術者試験については少し注意が必要です。このような国家資格で採用される言語は、古いバージョンを指定している場合があるからです。2022年2月現在は下記のようになっています。 * C: JIS X 3010 (最新版JIS X 3010:2003はISO/IEC 9899:1999(C99)相当、最新国際規格はISO/IEC 9899:2018(C17)) * Java: Java 8 (最新はJava 17) * Python: 3.7.3 (最新は3.10.2) * C++: JIS X 3014 (最新版JIS X 3014:2003はISO/IEC 14882:2003(C++03)相当、最新国際規格はISO/IEC 14882:2020(C++20)) * ECMAScript(JavaScript): JIS X 3060 (最新版JIS X 3060:2000はISO/IEC 16262:1998(ES2)相当、最新国際規格はECMA-262 12th(ES2021)) バージョンは変わることがあるため、最新情報は下記を参考にしてください。 https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_hanni_skill.html#yougo C++はC++11から、ECMAScriptはES2016(ES6とも)から大きな機能の追加があり、それまでと書き方が大きく変わっています。今さらC++03やES2相当を学ぶのは昔のコードの保守とかぐらいしか実用性はほとんど無いので良いです。JavaはJava 8から大きな機能追加(ラムダ式とか)がありましたので、最新のJava 17と比べて大きく変わるわけでは無いかも知れませんが、8以降に`var`等の割と使える機能が追加されているので、いまさらJava 8だけを学ぶのはちょっと利が薄い気がします(そもそも、みんなKotlinにシフトしちゃってる?)。 C99からC11の変化は細かい部分だけですし、未だにC99をターゲットにしているプロジェクトも多くあるので、C99で学んでもさほど問題はないでしょう。Pythonは採用されて間もないのもありますが、最新までにそれほど大規模な機能追加は今のところありません。 もし、基本情報試験にも、実用的にも使える言語として学ぶなら、枯れているCか、最新と遜色ないPythonがいいのではないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問