2017-10-28 10 views
0

2つのクラス、1つの抽象的親クラスLot.java、およびテストクラスTestLots.javaを割り当てられました。私はこれらのいずれかを編集するつもりはない。割り当ては、TestLotのエラーがもはやエラーではなくなるように、Lotの2つのサブクラスを作成することです。 互換性のないタイプ:LotType1はロットに変換することはできません、私はエラーを取得しかしカスタムクラス:カスタムタイプを他のカスタムタイプに変換することはできません

Lot ID L3 has area: 13500.0 
    Lot ID L2 has area: 27000.0 
    Lot ID L1 has area: 35000.0 
    Lot ID L4 has area: 70000.0 

プログラムの目的は、の順に多くの名前と領域を表示することであるが、このようなものです LotType2はLotに変換できません。私は問題が私のサブクラスにあり、それが親クラスをオーバーライドまたは参照するはずであると思われます。ここで

は、私はエラーを取得するTestLots、次のとおりです。ここで

public class TestLots { 

     public static void main(String args[]){ 
      // an array of lots -- some of type1, some of type2 
      Lot[] lots = {new LotType1("L1",350, 200), // error here 
       new LotType2("L2",100,270), 
       new LotType1("L3",100, 270), 
       new LotType2("L4",350,200) 
      }; 

      // sort the lots of mixed types by area (note, you'll have to implement 
      // Comparable interface correctly in LotType1 and LotType2 for this to work: 
      java.util.Arrays.sort(lots); 

      // print out sorted results 
      for (Lot lot: lots) { 
       System.out.print(lot + " "); 
       System.out.println(); 
      } 
     } 
    } 

public abstract class Lot { 

    public abstract double calculateArea(); 
    public abstract String getID(); 

    @Override 
    public String toString() { 
     return "Lot ID "+ getID() +" has area: "+ calculateArea(); 
    } 
} 

ロット、親クラスのサブクラスは、ほぼ同じですされています

public class LotType1 extends Lot implements Comparable<LotType1>{ 
    String name; 
    int height; 
    int width; 
    double area; 

    public LotType1(String name, int height, int width) { 
     this.name = name; 
     this.height = height; 
     this.width = width; 
    } 

    public String getID() { 
     return name; 
    } 

    public double calculateArea() { 
     return area = ((width * height)/2); 
    } 

    @Override 
    public int compareTo(LotType1 lot) { 
     area = ((width * height)/2); 
     if(area==lot.area) 
     { 
      return 0; 
     } 
     else if(area>lot.area) 
     { 
      return 1; 
     } 
     else 
     { 
      return -1; 
     } 
    } 
} 

を編集しますLotType2を追加:

public class LotType2 extends Lot implements Comparable<LotType2>{ 
    String name; 
    int height; 
    int width; 
    double area; 

    public LotType2(String name, int height, int width) { 
     this.name = name; 
     this.height = height; 
     this.width = width; 
    } 

    public String getID() { 
     return name; 
    } 

    public double calculateArea() { 
     return area = (width * height); 
    } 

    @Override 
    public int compareTo(LotType2 lot) { 
     area = (width * height); 
     if(area==lot.area) 
     { 
      return 0; 
     } 
     else if(area>lot.area) 
     { 
      return 1; 
     } 
     else 
     { 
      return -1; 
     } 
    } 
} 

申し訳ありませんが、この投稿はとても長いです。私は、関連するすべてのファイルを含めることにしました。

+0

また、LotType2クラスを追加します。 は、配列定義でLotType2をコメントしています。そのうまく動作します。 – Zenith

+0

クラスは「ほぼ同じ」かもしれませんが、明らかに十分に同一ではありません。私は名前を除いて 'LotType1'と同じ' LotType2'を作ろうとしました。それをコンパイルします。だから明らかに、あなたがそれを投稿する必要があることを意味するエラーを引き起こしている 'LotType2'については何か違うのです。 – ajb

+0

こんにちは@Preshus HB、ようこそ。回答が問題の解決に役立った場合は、回答の横にあるチェックマークをクリックして「受け入れ済み」とマークしてください。 。 – Jeff

答えて

1

問題は、同じコレクション内の異なる比較可能な実装を持つオブジェクトを並べ替えることができないということです。ロットのComparableを実装するサブクラスを変更します。

public class LotType1 extends Lot implements Comparable<Lot> { 

ともcompareToメソッドでcalculateArea()を使用します。

@Override 
    public int compareTo(Lot lot) { 
     if (calculateArea() == lot.calculateArea()) { 
      return 0; 
     } else if (calculateArea() > lot.calculateArea()) { 
      return 1; 
     } else { 
      return -1; 
     } 
    } 
+0

あなたは答えが正しいです。 – Zenith

0

コードのあなたの完全版は以下のとおりです。

それはあなたに期待される結果を与えるでしょう。

public class TestLots { 

public static void main(String args[]) { 
    // an array of lots -- some of type1, some of type2 
    Lot[] lots = {new LotType1("L1", 350, 200), // error here 
      new LotType2("L2", 100, 270), 
      new LotType1("L3", 100, 270), 
      new LotType2("L4", 350, 200) 
    }; 

    // sort the lots of mixed types by area (note, you'll have to implement 
    // Comparable interface correctly in LotType1 and LotType2 for this to work: 
    java.util.Arrays.sort(lots); 

    // print out sorted results 
    for (Lot lot : lots) { 
     System.out.print(lot + " "); 
     System.out.println(); 
    } 
} 
} 

abstract class Lot { 

public abstract double calculateArea(); 

public abstract String getID(); 

@Override 
public String toString() { 
    return "Lot ID " + getID() + " has area: " + calculateArea(); 
} 
} 


class LotType1 extends Lot implements Comparable<Lot> { 
String name; 
int height; 
int width; 
double area; 

public LotType1(String name, int height, int width) { 
    this.name = name; 
    this.height = height; 
    this.width = width; 
} 

public String getID() { 
    return name; 
} 

public double calculateArea() { 
    return area = ((width * height)/2); 
} 

@Override 
public int compareTo(Lot lot) { 
    if (calculateArea() == lot.calculateArea()) { 
     return 0; 
    } else if (calculateArea() > lot.calculateArea()) { 
     return 1; 
    } else { 
     return -1; 
    } 
} 
} 

class LotType2 extends Lot implements Comparable<Lot> { 
String name; 
int height; 
int width; 
double area; 

public LotType2(String name, int height, int width) { 
    this.name = name; 
    this.height = height; 
    this.width = width; 
} 

public String getID() { 
    return name; 
} 

public double calculateArea() { 
    return area = ((width * height)/2); 
} 

@Override 
public int compareTo(Lot lot) { 
    if (calculateArea() == lot.calculateArea()) { 
     return 0; 
    } else if (calculateArea() > lot.calculateArea()) { 
     return 1; 
    } else { 
     return -1; 
    } 
} 
} 
関連する問題