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

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

ただいまの
回答率

88.19%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 305

様々な図形の面積を求めるいくつかのインスタンスを別のクラスで番号をつけてランダムに実行するプログラムが描きたいです。

サブクラスはそれぞれRectangle,Circle1,Triangle,Squareです。

スーパークラスは以下の通りに作りました。

package object;

public abstract class Figure {

    double area = 0;
    abstract double getArea();
    abstract void identify();

    final String name;
    public Figure(String name) {
        this.name = "";

    }    
    public Figure(){
        this.name = "";
    }
    @Override
    public String toString() {
        return name + ":" + String.format("%.1f", getArea());
    }


}

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

package object;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class Figures{
    public static void main(String[] args) {
        Figure[] figures1 = new Figure[8];
        Figure[] figures2 = figures1.clone();
        Figure temp;

        Rectangle r1 = new Rectangle();
        Rectangle r2 = new Rectangle(30, 20);    
        int i = 0;

        figures1[i++] = r1;
        figures1[i++] = r2;

        Circle1 c1 = new Circle1();
        Circle1 c2 = new Circle1(25);
        figures1[i++] = c1;
        figures1[i++] = c2;

        System.out.println("The area of c1 is" + c1.getArea());
        System.out.println("The area of c2 is" + c2.getArea());

        Triangle t1 = new Triangle();
        Triangle t2 = new Triangle(30, 20);
        Triangle t3 = new Triangle(300, 200);
        System.out.println("The area of t1 is" + t1.getArea());
        System.out.println("The area of t2 is" + t2.getArea());
        System.out.println("The area of t3 is" + t3.getArea());

        figures1[i++] = t1;
        figures1[i++] = t2;
        figures1[i++] = t3;

        Square2 s1 = new Square2();
        Square2 s2 = new Square2(20);
        System.out.println("The area of s1 is " + s1.getArea());
        System.out.println("The area of s2 is " + s2.getArea());

        figures1[i++] = s1;
        figures1[i++] = s2;



        Figure[] cloneShuffle;Figure[] figures;{
            Figure[] result = figures.clone();
            Random rnd = ThreadLocalRandom.current();
            for (int k = result.length - 1; k > 0; k--) {
              int index = rnd.nextInt(k + 1);
              Figure temp1 = result[index];
              result[index] = result[k];
              result[k] = temp1;
            }
            return;
          }

         for(i=0;i<figures2.length;i++) {


System.out.println(figures2[i].getClass().getName()+":"+figures2[i].getArea());
        }
}

///図形の説明
class Figure{
        int count = 0;
        double area =0;
        double getArea() {
            return 0;
        }
}
class Rectangle extends Figure{

        int width;
        int height;
        String name="Rectangle";

        Rectangle(){
            setSize(10,20);
        }

        Rectangle(int width,int height){
            setSize(width,height);
        }

        void setSize(int w,int h) {
            width=w;
            height=h;
        }

        double getArea() {
            return width*height;
        }
}
class Circle extends Figure{
        int r;
        String name="Circle";
        Circle(){
            setSize(5);
        }
        Circle(int r){
            setSize(r);
        }

        void setSize(int r){
            this.r=r;
        }
        double getArea() {
            return r*r*Math.PI;
        }
}
}

このコードを実行すると、

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

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

 package object;

import java.util.concurrent.atomic.AtomicInteger;

public class Rectangle extends Figure {
    private double height = 0;
    private double width = 0;

    static final String NAME = Rectangle.class.getSimpleName();
    static final java.util.concurrent.atomic.AtomicInteger  counter = new AtomicInteger(0);


    Rectangle(){
        this.width = 20;
        this.height = 10;
    }
    Rectangle(double w, double h){
        this.width = w;
        this.height = h;
    }    
    void setWidth(double w) {
        this.width = w;
    }
    void setHeight(double h) {
        this.height = h;
    }
    void setSize(double w, double h) {
        setWidth(w);
        setHeight(h);
    }
    double getWidth() {
        return this.width;
    }
    double getHeight() {
        return this.height;
    }

    Rectangle(int width, int height){
        super(NAME + counter.addAndGet(1));
        this.width = width;
        this.height = height;
    }

    @Override
    double getArea() {
        return width * height;
    }
    void identify() {
        System.out.println("I am a rectangle with area" + getArea() + ".");
    }
}
package object;

import java.util.concurrent.atomic.AtomicInteger;

public class Circle1 extends Figure {
    private double radius = 0;

    static final String NAME = Rectangle.class.getSimpleName();
    static final java.util.concurrent.atomic.AtomicInteger  counter = new AtomicInteger(0);

    Circle1(){
    this.radius = 20;
    }

    void Circle(double r){
        this.radius = r;
    }
    void setRadius(double r) {
    }
    void setSize(double r) {
        setRadius(r);
    }
    double getRadius() {
    return this.radius;
    }
    Circle1(int r){
        super(NAME + counter.addAndGet(1));
        this.radius = r;

    }
    @Override
    double getArea() {
        area = Math.PI * this.radius * this.radius;
        return area;
        // TODO 自動生成されたメソッド・スタブ
    }
    void identify() {
        System.out.println("I am a Circle1 with area" + getArea() + "and" + getNumber() + ".");
        // TODO 自動生成されたメソッド・スタブ

    }
    private String getNumber() {
        // TODO 自動生成されたメソッド・スタブ
        return null;
    }
    @Override
    void iduntify() {
        // TODO 自動生成されたメソッド・スタブ

    }

}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hoshi-takanori

    2021/01/06 02:47

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

    キャンセル

  • dodox86

    2021/01/06 11:57

    コンパイルエラーを取ることに集中してしまっているのか、少々場当たり的な修正で混乱を呼んでいる気がします。先の以下のご質問ではFigureクラスは抽象クラスで、それを継承したものがRectangleなどであったはずですが、ひとつひとつ解決しましょう。

    [個々のインスタンスに番号を振りたいです。サブクラスの扱い方等、、]
    https://teratail.com/questions/314103
    (※修正著しいようなので回答はやめました)

    キャンセル

回答 2

checkベストアンサー

+4

すでに回答、コメントついていますが
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 21:30

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

    キャンセル

+1

class Rectangle extends Figure{

と、

class Circle extends Figure{

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/06 11:27

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

    キャンセル

  • 2021/01/06 11:29

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

    キャンセル

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

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

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