🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

2回答

2252閲覧

「型の不一致」というエラーメッセージに関して、それぞれの型の違いがわかりません。

shimajiro1917

総合スコア4

Java

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

0グッド

0クリップ

投稿2021/01/05 16:40

#様々な図形の面積を求めるいくつかのインスタンスを別のクラスで番号をつけてランダムに実行するプログラムが描きたいです。
サブクラスはそれぞれRectangle,Circle1,Triangle,Squareです。
##スーパークラスは以下の通りに作りました。

java

1package object; 2 3public abstract class Figure { 4 5 double area = 0; 6 abstract double getArea(); 7 abstract void identify(); 8 9 final String name; 10 public Figure(String name) { 11 this.name = ""; 12 13 } 14 public Figure(){ 15 this.name = ""; 16 } 17 @Override 18 public String toString() { 19 return name + ":" + String.format("%.1f", getArea()); 20 } 21 22 23} 24

###これらのサブクラスをFiguresというクラスに入れてランダムに面積をコンソールに表示したいです。

java

1package object; 2 3import java.util.Random; 4import java.util.concurrent.ThreadLocalRandom; 5 6public class Figures{ 7 public static void main(String[] args) { 8 Figure[] figures1 = new Figure[8]; 9 Figure[] figures2 = figures1.clone(); 10 Figure temp; 11 12 Rectangle r1 = new Rectangle(); 13 Rectangle r2 = new Rectangle(30, 20); 14 int i = 0; 15 16 figures1[i++] = r1; 17 figures1[i++] = r2; 18 19 Circle1 c1 = new Circle1(); 20 Circle1 c2 = new Circle1(25); 21 figures1[i++] = c1; 22 figures1[i++] = c2; 23 24 System.out.println("The area of c1 is" + c1.getArea()); 25 System.out.println("The area of c2 is" + c2.getArea()); 26 27 Triangle t1 = new Triangle(); 28 Triangle t2 = new Triangle(30, 20); 29 Triangle t3 = new Triangle(300, 200); 30 System.out.println("The area of t1 is" + t1.getArea()); 31 System.out.println("The area of t2 is" + t2.getArea()); 32 System.out.println("The area of t3 is" + t3.getArea()); 33 34 figures1[i++] = t1; 35 figures1[i++] = t2; 36 figures1[i++] = t3; 37 38 Square2 s1 = new Square2(); 39 Square2 s2 = new Square2(20); 40 System.out.println("The area of s1 is " + s1.getArea()); 41 System.out.println("The area of s2 is " + s2.getArea()); 42 43 figures1[i++] = s1; 44 figures1[i++] = s2; 45 46 47 48 Figure[] cloneShuffle;Figure[] figures;{ 49 Figure[] result = figures.clone(); 50 Random rnd = ThreadLocalRandom.current(); 51 for (int k = result.length - 1; k > 0; k--) { 52 int index = rnd.nextInt(k + 1); 53 Figure temp1 = result[index]; 54 result[index] = result[k]; 55 result[k] = temp1; 56 } 57 return; 58 } 59 60 for(i=0;i<figures2.length;i++) { 61 62 63System.out.println(figures2[i].getClass().getName()+":"+figures2[i].getArea()); 64 } 65} 66 67///図形の説明 68class Figure{ 69 int count = 0; 70 double area =0; 71 double getArea() { 72 return 0; 73 } 74} 75class Rectangle extends Figure{ 76 77 int width; 78 int height; 79 String name="Rectangle"; 80 81 Rectangle(){ 82 setSize(10,20); 83 } 84 85 Rectangle(int width,int height){ 86 setSize(width,height); 87 } 88 89 void setSize(int w,int h) { 90 width=w; 91 height=h; 92 } 93 94 double getArea() { 95 return width*height; 96 } 97} 98class Circle extends Figure{ 99 int r; 100 String name="Circle"; 101 Circle(){ 102 setSize(5); 103 } 104 Circle(int r){ 105 setSize(r); 106 } 107 108 void setSize(int r){ 109 this.r=r; 110 } 111 double getArea() { 112 return r*r*Math.PI; 113 } 114} 115} 116 117

####このコードを実行すると、
figures1[i++] = r1;
figures1[i++] = r2;
は格納されるのですが、残りのCircle1,Triangle,Squareがうまく格納されず「型の不一致: Circle1 から Figures.Figure には変換できません」というエラーメッセージが表示されてしまいます。

RectangleのコードとCircle1のコードは以下のように描きました。

java

1 package object; 2 3import java.util.concurrent.atomic.AtomicInteger; 4 5public class Rectangle extends Figure { 6 private double height = 0; 7 private double width = 0; 8 9 static final String NAME = Rectangle.class.getSimpleName(); 10 static final java.util.concurrent.atomic.AtomicInteger counter = new AtomicInteger(0); 11 12 13 Rectangle(){ 14 this.width = 20; 15 this.height = 10; 16 } 17 Rectangle(double w, double h){ 18 this.width = w; 19 this.height = h; 20 } 21 void setWidth(double w) { 22 this.width = w; 23 } 24 void setHeight(double h) { 25 this.height = h; 26 } 27 void setSize(double w, double h) { 28 setWidth(w); 29 setHeight(h); 30 } 31 double getWidth() { 32 return this.width; 33 } 34 double getHeight() { 35 return this.height; 36 } 37 38 Rectangle(int width, int height){ 39 super(NAME + counter.addAndGet(1)); 40 this.width = width; 41 this.height = height; 42 } 43 44 @Override 45 double getArea() { 46 return width * height; 47 } 48 void identify() { 49 System.out.println("I am a rectangle with area" + getArea() + "."); 50 } 51} 52

java

1package object; 2 3import java.util.concurrent.atomic.AtomicInteger; 4 5public class Circle1 extends Figure { 6 private double radius = 0; 7 8 static final String NAME = Rectangle.class.getSimpleName(); 9 static final java.util.concurrent.atomic.AtomicInteger counter = new AtomicInteger(0); 10 11 Circle1(){ 12 this.radius = 20; 13 } 14 15 void Circle(double r){ 16 this.radius = r; 17 } 18 void setRadius(double r) { 19 } 20 void setSize(double r) { 21 setRadius(r); 22 } 23 double getRadius() { 24 return this.radius; 25 } 26 Circle1(int r){ 27 super(NAME + counter.addAndGet(1)); 28 this.radius = r; 29 30 } 31 @Override 32 double getArea() { 33 area = Math.PI * this.radius * this.radius; 34 return area; 35 // TODO 自動生成されたメソッド・スタブ 36 } 37 void identify() { 38 System.out.println("I am a Circle1 with area" + getArea() + "and" + getNumber() + "."); 39 // TODO 自動生成されたメソッド・スタブ 40 41 } 42 private String getNumber() { 43 // TODO 自動生成されたメソッド・スタブ 44 return null; 45 } 46 @Override 47 void iduntify() { 48 // TODO 自動生成されたメソッド・スタブ 49 50 } 51 52} 53

型の不一致というエラーはStringとintの時によくみられるエラーですが、今回私は全てint型で書いているつもりで、なぜRectangleは実行できたのに他のものが実行できなかったのかがわかりませんでした。試しにRectangleとCircleの順を変えてみたのですが結果は同じでした。
初心者で理解が甘い部分があるかと思います。何かわかるかたがいらっしゃいましたらご回答をお願いします。

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

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

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

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

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

hoshi-takanori

2021/01/05 17:47

Figure クラスが 2 つありますね…。
dodox86

2021/01/06 02:57

コンパイルエラーを取ることに集中してしまっているのか、少々場当たり的な修正で混乱を呼んでいる気がします。先の以下のご質問ではFigureクラスは抽象クラスで、それを継承したものがRectangleなどであったはずですが、ひとつひとつ解決しましょう。 [個々のインスタンスに番号を振りたいです。サブクラスの扱い方等、、] https://teratail.com/questions/314103 (※修正著しいようなので回答はやめました)
guest

回答2

0

ベストアンサー

すでに回答、コメントついていますが
Figureクラスが2つ存在しています。

FQCN(パッケージを指定した完全名)でいうと
提示されているソースから読み取れるクラスは以下のようになっています。

object.Figure
object.Figures (main実行クラス)
object.Figures.Figure
object.Figures.Rectangle (extends object.Figures.Figure)
object.Figures.Circle (extends object.Figures.Figure)
object.Rectangle (extends object.Figure)
object.Circle1 (extends object.Figure)

※TriangleとSquare2もobject.Figureを継承しているものと想像しています

mainの中で定義している

Figure[] figures1 は、object.Figures.Figureの配列です。

mainの中で new している、Rectangleはobject.Figures.Rectangle
Circle1はobject.Circle1です。

Figureと同じ名前ではありますが、

object.Figures.Figure と、object.Figureは異なるため

Circle1(as object.Figure)は、object.Figures.Figureの配列に格納できません。

RectangleもFigureクラス同様に2つ存在していて、
mainでnewしているRectangleは、
object.Figures.Rectangle のインスタンス(object.Figures.Figureのサブクラス)であるため。

Rectangleは実行できたのに他のものが実行できなかった

という結果となります。

Rectangle r1 = new Rectangle();

の部分を

object.Rectangle r1 = new object.Rectangle();

とすると、同様のエラーが発生するはずです。

投稿2021/01/06 02:27

編集2021/01/06 02:35
momon-ga

総合スコア4826

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

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

shimajiro1917

2021/01/06 12:30

その通りに実行したら解決できました、ありがとうございます。
guest

0

class Rectangle extends Figure{

と、

class Circle extends Figure{

のFigureは、あなたの言っているスーパークラスのFigureとは別のクラスですね

投稿2021/01/05 23:21

y_waiwai

総合スコア88038

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

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

shimajiro1917

2021/01/06 02:27

なぜ違ってしまったのでしょう、、、
y_waiwai

2021/01/06 02:29

あなたが違うようにコードを書いたからです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問