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

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

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

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

解決済

自作クラスのコンストラクタを別のコンストラクタの引数に入れる

oimo0505
oimo0505

総合スコア20

Java

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

2回答

0リアクション

2クリップ

534閲覧

投稿2022/08/18 05:45

編集2022/08/18 06:31

前提

抽象クラスissueのサブクラスにBondクラスを加え、BondクラスのコンストラクタにIssueを引数とする段階でつまづいています。下記のエラー文が表示されるのはBondコンストラクタ引数のissueから何も検出されないため、Issueクラス内のコンストラクタと相違が生じるためでしょうか。また修正案などについてもご教授いただきたいです。よろしくお願いします。

同じディレクトリ内でenum型定義用のBondType.javaファイルも作成しているためソースを併せて添付しておきます。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • IssueをBondコンストラクタの引数として扱いたい。

発生している問題・エラーメッセージ

Issue.java:29: エラー: クラス Issueのコンストラクタ Issueは指定された型に適用できません。 public Bond (Issue issue, int maturity, double coupon) {          ^ 期待値: String,String 検出値: 引数がありません 理由: 実引数リストと仮引数リストの長さが異なります

該当のソースコード

Issue.java

Java

import java.util.Objects; public abstract class Issue { private String code; private String name; public Issue (String code, String name) { this.code = code; this.name = name; if (code == null || name == null) { throw new IllegalArgumentException("nullです。"); } } // getter public String getCode() { return this.code; } public String getName() { return this.name; } } class Bond extends Issue { private Issue issue; private int maturity; private double coupon; private BondType type; public Bond (Issue issue, int maturity, double coupon) { this.issue = issue; this.maturity = maturity; this.coupon = coupon; // チェック処理 if (maturity < 20000101 || 29991231 < maturity || coupon < 0) { throw new IllegalArgumentException("数値が範囲外です"); } if (coupon == 0) { type = BondType.ZERO_COUPON_BOND; } else { type = BondType.COUPON_BOND; } } //getter public Issue getIssue() { return this.issue; } public int getMaturity() { return this.maturity; } public double getCoupon() { return this.coupon; } public BondType getBondType() { return this.type; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append(issue); builder.append(maturity); builder.append(coupon); builder.append(type); return builder.toString(); } //equalsメソッド @Override public boolean equals (Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } Bond other =(Bond)obj; if (this.issue != other.issue) { return false; } if (maturity == 0) { if (other.maturity != 0) { return false; } } else if (maturity != other.maturity) { return false; } if (Double.compare(other.coupon,coupon) != 0) { return false; } return true; } //hashCode @Override public int hashCode() { return Objects.hash(this.issue, this.maturity, this.coupon); } }

BondType.java

public enum BondType { COUPON_BOND, ZERO_COUPON_BOND };

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

int32_t

2022/08/18 06:05

Bondのインスタンスは規定クラスとしての Issue インスタンスと フィールド issue の Issue インスタンスの2つを持つことになりますが、これは意図通りですか?
oimo0505

2022/08/18 06:15

int32_t様 コメントありがとうございます。基底クラスのIssueのみをBondのコンストラクタに引数として渡す意図です。理解が追いついておらず的確な回答になっていなければ申し訳ございません。
int32_t

2022/08/18 06:25

うーん、質問を理解しておられないようです。 BondはIssueを継承しているので、Bondクラスにも getCode() getName() メソッドがありますが、これらは必要ですか? もし必要なら、どういう値を返すべきですか?
oimo0505

2022/08/18 06:34

Issueの中にcode,nameが含まれているためgetterは必要だと考えていました。値に関してなんですが、Bondで使うようになるissueを返すようにするとかですかね?
int32_t

2022/08/18 06:42

Bond が Issue を継承している理由はなんでしょうか? Issue が1つも抽象メソッドを持っていないのに抽象クラスなのはなぜですか?
oimo0505

2022/08/18 06:54

Issueをpublicな抽象クラス、BondクラスをIssueのサブクラスとするという問題に取り組んでいるためです。この段階では問題の途中経過であるため理由なくしているように見える箇所もあると思います。前提が不十分で申し訳ございません。
hoshi-takanori

2022/08/18 07:01

> Issueをpublicな抽象クラス、BondクラスをIssueのサブクラスとする その場合、Bond のコンストラクタに Issue を渡すのではなく、Issue のコンストラクタの引数を渡すのが一般的かと。ちなみに、なにか参考にしている教科書とかありますか?
oimo0505

2022/08/18 07:07

hoshi-takanori様 コメントありがとうございます。 BondをIssueの引数に渡し、Issue引数をcode,name,Bondにするという認識でしょうか。 教科書はやさしいjava第7版を使用しています。
hoshi-takanori

2022/08/18 07:36

継承の理解が怪しいですね。その本には Car と RacingCar の例が出てくるようですが、それを復習すると良いかと…。
jimbe

2022/08/18 11:48 編集

Issue が abstract で、 Issue を継承したクラスが Bond しか無いのに、 Bond のコンストラクタにどうやって Issue オブジェクトを渡すつもりなのでしょうか。 通常はサブクラスのコンストラクタはスーパークラスのコンストラクタを呼ぶものですが、その辺りはどう理解されているのか…。
oimo0505

2022/08/18 15:54

hoshi-takanori様 その例を見ながら取り組んでいたのでもう一度深く読み込んでみます。 その後、Issueコンストラクタの引数にBondを入れるよう修正したいと思います。
oimo0505

2022/08/18 15:57

jimbe様 コメントありがとうございます。 正直abstractに関しては今回初めて用いるため知識不足が露骨に出てしまいました。 そのため、もう一度教科書を読み直した後おっしゃるようにサブクラスのコンストラクタをスーパークラスのコンストラクタに渡すよう修正してみます。
jimbe

2022/08/18 17:38 編集

> サブクラスのコンストラクタをスーパークラスのコンストラクタに渡す 「コンストラクタを渡す」ということは出来ませんし、私はそのようには書いていませんが。 継承や抽象よりも先に「クラス」「オブジェクト」「コンストラクタ」を明確に分けて扱えないと、幾ら教科書・入門書を見ても teratail で説明されても理解が進まないと思います。 抽象クラスは必要にならないと中々分かり辛く、まして継承自体のイメージも出来上がっていなければ机上の勉強だけでは難しいと思います。 可能なら abstract は飛ばして、後から出てきたらもう一度でも二度でも戻ってくる風に臨機応変に (?) 学習を進めては如何でしょうか。
Crimson_Tide

2022/08/18 21:28

jimbeさんが御指摘されているように「抽象クラスはインスタンス化」できないため、 以下 Issueのことを「Issueのインスタンス」ではなく「Issue型のオブジェクト」と表記しています。 hoshi-takanoriさんが仰っている [Bond のコンストラクタに Issue を渡すのではなく、Issue のコンストラクタの引数を渡す]は、 現状の"public Bond (Issue issue, ..... )"ように Bond のコンストラクタの引数にIssue型のオブジェクト Issue issue を渡す とするのではなく、 > Issueクラス のコンストラクタ"Issue (String code, String name)"の引数である(String code, String name)を渡す つまり public Bond (Issue issue, int maturity, double coupon) を public Bond (String code, String name, int maturity, double coupon) にするということかと思います。 この場合、int32_tさんの回答の super(issue.getCode(), issue.getName());の部分が super(code, name);になりますね BondのコンストラクタでIssue型のオブジェクトを引数にするという指定がないのであれば、こちらのほうが自然に感じます。
BeatStar

2022/08/19 02:02

理解できたのなら質問を閉じてください。まだ未解決扱いですよ。 すでについている回答で理解できたならその回答をベストアンサーにし、自分で深掘りしたとかで解決したなら「自己解決」的なやつがあるはずなのでそこに『どういう風に解決したか』みたいなものを書いてください。お願いします。
oimo0505

2022/08/19 02:05

jimbe様 知識不足により解釈を誤ってしまい申し訳ございません。 諸事情でこのabstractの課題を最優先で取り組む必要があるので今一度『クラス』等から復習させていただきたいと思います。
jimbe

2022/08/19 02:13

> abstractの課題を最優先で取り組む必要がある ナカナカ厄介な状況のようで ><
oimo0505

2022/08/19 02:15

Crimson_Tide様 とても丁寧な解説ありがとうございます。 引数を渡すということだったのですね。とても大きな勘違いをしていました。 設問に「Issueクラスのコンストラクタを使ってBondクラスのコンストラクタを定義する」とあるのですが、この文が自分の中で明確に理解できていないため、今回しどろもどろな感じになっている気がします。この設問の場合は 「BondのコンストラクタでIssue型のオブジェクトを引数にする指定」はないことになるのでしょうか。「コンストラクタを使って」という箇所が「コンストラクタの引数を使って」と解釈していいのか気になります。
oimo0505

2022/08/19 02:18

BeatStar様 ご指摘ありがとうございます。 最初の質問自体はコンパイルが通り解決したのですが、他の方々のご意見をいただき質問とは別の箇所に疑問を抱いたため、ご意見をいただきたく質問を閉じていませんでした。 この場合普通は質問を閉じるべきなのでしょうか。
oimo0505

2022/08/19 02:20

jimbe様 そもそもこの課題に至るまで曖昧な解釈で課題をクリアできていたことに問題があると思います。 この課題で改めて知識不足を実感させられたため、一度復習する機会を得たと思って復習からしていきたいと思います!
int32_t

2022/08/19 02:35

> 設問に「Issueクラスのコンストラクタを使ってBondクラスのコンストラクタを定義する」 それは、私の回答にあるような super() 呼び出しのことです。引数にしろという意味ではありません。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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