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

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

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

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

Q&A

解決済

5回答

1959閲覧

戻り値の型の指定の必要性

shichihukujin

総合スコア18

Java

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

0グッド

0クリップ

投稿2016/10/03 11:47

public int cal(int a){ //計算処理 }

のコードのように戻り値の型として、int型を指定していますが、
このほかにも様々な戻り値の型がもちいられます。
しかし、僕にとって、戻り値の型の指定は
このメソッドがどの型の戻り値を返すかを示すものにすぎません
例えば上の場合、calメソッドはint型を返すのか、とわかります。
つまり、人間の理解のための印にしか感じません。
戻り値の型の指定をすることがjavaの文法から消えたら
人間の理解のほかに、不具合が生じることがあるのですか?
教えてください

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

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

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

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

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

guest

回答5

0

静的型付け言語でも戻り値の型指定をなくすことは可能で、実際にそういう仕様にしている言語はたくさんあります。型推論と呼ばれます。
(型推論というのはもっと広い分野を指す用語ですが)

C++は省略できるようになりましたし、TypeScriptも、あとなんだ、Crystal。いきなりマイナー言語すみません。

関数型言語は大体戻り値型指定いりませんし。

投稿2016/10/03 12:24

yuba

総合スコア5568

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

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

shichihukujin

2016/10/03 12:49

広い視野からの回答ありがとうございます。 そのような言語があることを知りませんでした。 これからの勉強の参考になりました。
guest

0

ベストアンサー

まず、動的(型付け)言語では型を指定しないので、
プログラムを動作させるのに絶対必須ではありません。

しかし、静的言語、
とくに大規模開発によく用いられるJavaでは、
開発の属人性を低くするため性悪説的に、
interfaceと合わせて型安全性を重視しています。
したがって、戻り値の型も指定するのです。


これだけだと分かりにくいと思うので、さらに詳しく言います。

ひとりで組んでるときは、戻り値の型指定が不要に思えるでしょうが、
多人数で組むと、設計者(や他の実装者)の意図が不明なことがあります。
とくにインターフェイスによる型指定は設計の意図を示します。

静的言語の型付け部分は、型設計用の専用言語
だと考えると分かりやすいです。

これには違和感があるかもしれませんが、
でもたとえば正規表現も、ホスト言語とは別の外部DSLですが、
パターンマッチ用のひとつの言語として認められてますよね。


つまり、(インターフェイスによる)型指定は、「戻り値はintだよ」などと、
自分とは別の設計者(または他の実装者)が、意図を示しています

しかも、意図を示すだけならコメントに書いてもいいですが、
コンパイルエラーで弾くことによって、
設計の型を実装者に機械的に強制できます。

これをしないと、たとえば実装者が勝手に戻り値を別の型にしてしまい、
別の場所で型のエラーが出て、デバッグに時間がかかったりします。

だから、大規模開発で、型付けのコストを
デバッグやテストなどのコストが上回るとしたら、
型付けに合理性があるだろう、という考え方です。

投稿2016/10/03 12:35

編集2016/10/03 12:43
LLman

総合スコア5592

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

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

shichihukujin

2016/10/03 12:47

詳しい解説ありがとうございます。 自分が今持っている、知識と結びついて、理解しやすい解説でした。
guest

0

こんにちは。

以下、「こういうことをしてみてはいかがでしょう?」という提案になります。
ですので、質問に対する直接的な回答にはなっていないかもしれません。
その点はご了承ください。

まず、僭越ながら言わせて頂きますと、そういう細かいところにいちいち疑問を持ち、
適当な自己流の解釈で流さないで、このような質問サイトで、質問として投げる
というのは、プログラマーになるための資質として大変良いことと思いました。

貴殿のブログも拝読させて頂きましたが、Androidアプリを開発することを見据えて、
JAVAからプログラミングを始められたとお見受けしました。自分が作りたいアプリを、
まがりなりにも作れる段階までJAVAの学習を進めるのは、主軸としてはよいと思う一方で、

戻り値の型の指定をすることがjavaの文法から消えたら
人間の理解のほかに、不具合が生じることがあるのですか?

という疑問を別の角度から考えるために、動的型付け言語の
どれか1つに、一瞬寄り道してみるのもいいかもしれません。
(というのが私の提案です。)

寄り道する言語は、Python でもPHPでもRubyでも、どれか好みのものを
選べばよいかと思います。

これらの言語の入門編に寄り道したあとで、この質問を再度
振り返ると、おそらく何か気づきがあると思います。

学習が上手く進むといいですね。

投稿2016/10/03 13:02

jun68ykt

総合スコア9058

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

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

shichihukujin

2016/10/03 14:12

おっしゃる通り、僕はJavaしか学んでいないのでJavaのことを客観的に理解できていません。 ご提案ありがとうございます。独学のために助言ありがたいです。 動的型付け言語を学び、Javaを理解する必要はありますね。 現在Androidアプリではなく先にwebアプリを一つ作ろうと考え、 JSPやサーブレットの入門書を読み始めようとしています。 なのでPHPを学ぶのが良いと考えました。 回答ありがとうございます。
guest

0

Javaは静的型付け言語なので実行前にメソッドの返す型がわかっている必要があります、Javaではコンパイル時にメソッドが返す型を解析しています。

仮にこの仕様がなくなった場合、実行時に型付けの齟齬が出てしまうため実行時エラーが大量に発生しますね。
リファレンスを見ればいいと言う人もいますが、全ての人がリファレンスを見ているわけではありません。これはteratailの質問を見てもわかりますよね。

投稿2016/10/03 12:28

yona

総合スコア18155

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

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

shichihukujin

2016/10/03 12:42

Javaが静的型付け言語ということを知りませんでした。 しかるべき時になったら、それについて勉強しようと思います。 確かに、 public Object next(){ //インスタンスaを取得する処理 return a; } とした場合、aはObject型のようです これは静的型付けが関係していると察します。 Javaではコンパイル時にメソッドが返す型を解析しています。 この回答も勉強になりました。
guest

0

人間の理解のための印にしか感じません。

そんなことはありません。例えば、以下のようなメソッドを書けばコンパイルエラーになります。

java

1public int cal(int a){ 2 // 返り値の型が合わずコンパイルエラー 3 return "some invalid string"; 4} 5 6public int cal2(int a){ 7 if(a == 5){ 8 return 3; 9 } 10 // 値を返さない可能性があるのでコンパイルエラー 11}

そして何より、このメソッドを使う側で型情報が必要となります。

投稿2016/10/03 12:22

maisumakun

総合スコア145121

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

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

yuba

2016/10/03 12:28

このcal2メソッドだと、戻り値がintだという指定がなくても「intが返るパスとvoidが返るパスがある」と静的に判断できるのでコンパイルエラーを生成することは原理的に可能です。 Javaで型推論不能例を挙げるなら、型の最大公約数を取る場合の問題に触れる必要があるのでは。
shichihukujin

2016/10/03 12:52

具体例まで示してくださりありがとうございます。 そして、その補足コメントも助かります。 しかし、コンパイルエラーをだす目的が全く不明だったために、僕には満足できる回答ではありませんでした。ごめんなさい
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問