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

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

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

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

Q&A

解決済

1回答

1732閲覧

JAVA言語のプロトタイプ宣言・・・?のようなものについて。

taka_0407

総合スコア8

Java

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

0グッド

4クリップ

投稿2018/10/04 07:31

編集2018/10/05 02:29

初めまして、現在”関数型リアクティブプログラミング” 著Stephen Blackheath を読みながら勉強をしています。

その中で、一つどうしてもわからない箇所があったので、ご質問をさせていただきました。

Java言語にて、クラスの中に処理が書かれていないメソッド?のようなものがあるのですが、これがなんのために存在しているのかいまいちわかりません・・・。

C言語を以前触っており、関数を使用する前にしなければいけないプロトタイプ宣言に似たものなのかな・・・?と思いましたが、調べてみると、Java言語はする必要が無いようで、おそらく違うと見ています。

また、コードは書籍からの引用となりますので、最低限のものだけこちらに記載させていただきました。

sodiumというFRPライブラリがCentral Repositoryから参照されています。

また、他に同じディレクトリ下に6つのフォルダがあり、mavenを用いて参照されています。

一度その一行をコメントアウトすると、シンボルが見つからないというエラーが出たので、そのエラーメッセージからも少し調べましたが、これといった答えにはたどり着けませんでした・・・。

Java言語については完全に初心者ですが、どうかご教授お願いいたします。

Java

1 2import java.awt.Graphics; 3 4public class Drawable { 5 public void draw(Graphics g, int ht, Point orig, double scale) {}; //ここはなんのためにある・・・プロトタイプ宣言的な・・・?(なかったら動かない 6 public final Drawable append(Drawable second) { 7 Drawable first = this; 8 return new Drawable() { 9 public void draw(Graphics g, int ht, Point orig, double sc) { 10 first.draw(g, ht, orig, sc); 11 second.draw(g, ht, orig, sc); 12 } 13 }; 14 } 15}

以下加筆いたします。
エラーが出る場合のエラーメッセージです。
最初にlsでディレクトリの中身も記載しておきます。

hogehoge:continuous taka$ ls Animate.java Animation.java Drawable.java Point.java Shapes.java fwoomph.java pom.xml target hogehoge:continuous taka$ mvn test -Pfwoomph [INFO] Scanning for projects... [INFO] [INFO] ----------< nz.sodium.continuous-time:sodium-continuous-time >---------- [INFO] Building sodium-continuous-time 1.0.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ sodium-continuous-time --- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory /Users/taka/continuous/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ sodium-continuous-time --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! [INFO] Compiling 6 source files to /Users/taka/continuous/target/classes [INFO] ------------------------------------------------------------- [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] /Users/taka/continuous/Drawable.java:[9,22] シンボルを見つけられません シンボル: メソッド draw(java.awt.Graphics,int,Point,double) 場所: タイプDrawableの変数 first [ERROR] /Users/taka/continuous/Drawable.java:[10,23] シンボルを見つけられません シンボル: メソッド draw(java.awt.Graphics,int,Point,double) 場所: タイプDrawableの変数 second [ERROR] /Users/taka/continuous/Shapes.java:[25,19] シンボルを見つけられません シンボル: メソッド draw(java.awt.Graphics,int,Point,double) 場所: タイプDrawableの変数 dr [ERROR] /Users/taka/continuous/Shapes.java:[33,19] シンボルを見つけられません シンボル: メソッド draw(java.awt.Graphics,int,Point,double) 場所: タイプDrawableの変数 dr [ERROR] /Users/taka/continuous/Shapes.java:[41,20] シンボルを見つけられません シンボル: メソッド draw(java.awt.Graphics,int,Point,double) 場所: タイプDrawableの変数 drb [ERROR] /Users/taka/continuous/Shapes.java:[42,20] シンボルを見つけられません シンボル: メソッド draw(java.awt.Graphics,int,Point,double) 場所: タイプDrawableの変数 dra [ERROR] /Users/taka/continuous/Animate.java:[26,26] シンボルを見つけられません シンボル: メソッド draw(java.awt.Graphics,int,Point,double) 場所: クラス Drawable [INFO] 7 errors [INFO] ------------------------------------------------------------- [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.696 s [INFO] Finished at: 2018-10-04T16:41:32+09:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project sodium-continuous-time: Compilation failure: Compilation failure: [ERROR] /Users/taka/continuous/Drawable.java:[9,22] シンボルを見つけられません [ERROR] シンボル: メソッド draw(java.awt.Graphics,int,Point,double) [ERROR] 場所: タイプDrawableの変数 first [ERROR] /Users/taka/continuous/Drawable.java:[10,23] シンボルを見つけられません [ERROR] シンボル: メソッド draw(java.awt.Graphics,int,Point,double) [ERROR] 場所: タイプDrawableの変数 second [ERROR] /Users/taka/continuous/Shapes.java:[25,19] シンボルを見つけられません [ERROR] シンボル: メソッド draw(java.awt.Graphics,int,Point,double) [ERROR] 場所: タイプDrawableの変数 dr [ERROR] /Users/taka/continuous/Shapes.java:[33,19] シンボルを見つけられません [ERROR] シンボル: メソッド draw(java.awt.Graphics,int,Point,double) [ERROR] 場所: タイプDrawableの変数 dr [ERROR] /Users/taka/continuous/Shapes.java:[41,20] シンボルを見つけられません [ERROR] シンボル: メソッド draw(java.awt.Graphics,int,Point,double) [ERROR] 場所: タイプDrawableの変数 drb [ERROR] /Users/taka/continuous/Shapes.java:[42,20] シンボルを見つけられません [ERROR] シンボル: メソッド draw(java.awt.Graphics,int,Point,double) [ERROR] 場所: タイプDrawableの変数 dra [ERROR] /Users/taka/continuous/Animate.java:[26,26] シンボルを見つけられません [ERROR] シンボル: メソッド draw(java.awt.Graphics,int,Point,double) [ERROR] 場所: クラス Drawable [ERROR] -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

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

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

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

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

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

Udomomo

2018/10/04 07:37

その一行をコメントアウトしたときに出たエラーメッセージを、そのまま載せていただけますか?
taka_0407

2018/10/04 07:52

Udomomoさん、Apache mavenというプロジェクト管理ツール?を用いていて、少し長くなってしまいますが、加筆させていただきました。どうぞ、よろしくおねがいたします。
guest

回答1

0

ベストアンサー

まず匿名クラスについて知らなければなりません。

Java

return new Drawable() {
public void draw(Graphics g, int ht, Point orig, double sc) {
first.draw(g, ht, orig, sc);
second.draw(g, ht, orig, sc);
}
};

ここでreturnされているのは、Drawableを継承する無名のクラスのインスタンスです。
これは次のように書いているのと動作としては同じです。

Java

1class Tmp extends Drawable { 2 @Override 3 public void draw(Graphics g, int ht, Point orig, double sc) { 4 first.draw(g, ht, orig, sc); 5 second.draw(g, ht, orig, sc); 6 } 7} 8 9return new Tmp();

drawメソッドが継承されるので、元のクラスにも当然宣言が無ければいけません。
そういう意味では、Cのプロトタイプ宣言に似ているところもあります。

ただし、Drawableクラスは具象クラスとして定義されています。
drawメソッドも実装される必要があり、ここでは『何もしない』メソッドとされているようです。


クラスの役割が混在しているのが分かりづらさの要因のような気がします。

  • 『何かを書く』一連の処理を持つ役割
  • 処理同士を結合する役割

せめてappendメソッドはstaticにした方が分かり易いと思うんですがね。
こんなイメージで。

Java

1@FunctionalInterface 2interface Drawable { 3 void draw(String str); 4 5 static Drawable concatenate(Drawable... tasks) { 6 return (str) -> { 7 for(Drawable task: tasks) { task.draw(str); } 8 }; 9 } 10} 11 12class Main { 13 public static void main(String[] args) { 14 Drawable task1 = (str) -> System.out.println("task1: " + str); 15 Drawable task2 = (str) -> System.out.println("task2: " + str); 16 Drawable task3 = (str) -> System.out.println("task3: " + str); 17 18 Drawable.concatenate(task1, task2, task3).draw("hoge"); 19 } 20}

実行結果 Wandbox

task1: hoge task2: hoge task3: hoge

投稿2018/10/04 08:44

編集2018/10/04 09:03
LouiS0616

総合スコア35658

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

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

taka_0407

2018/10/05 02:27

LouiS0616さん、ご回答ありがとうございます!!! 匿名クラスとoverrideについて調べて見たらスッキリしました! オーバーライドと同じ動作をして、上書きするための元のメソッドが必要なんですね・・・! いただいた仮に名前をつけたTmpクラスでインスタンスを作ったものをreturnしているという例もとても分かりやすく、改善例までだしていただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問