2017-02-09 9 views
-1

クラスに実装されている抽象メソッドがありますが、このメソッドをmainから呼び出そうとすると、メソッドリストに表示されません。インターフェイスからのものを除いて、他のすべての方法が表示されます。私は何を間違えたのですか?メインでインターフェイスメソッドをどのように呼び出すのですか?

public interface Printable { 
    public void print(); 
} 

実装可能です。

@Override 
    public void print() { 
     for(int i = 0; i < getLength(); i++){ 
      for(int j = 0; j < getLength(); j++){ 
       System.out.println("o"); 
      } 
      System.out.println(); 
     } 
    } 

メインで印刷可能なメソッドは使用できません。

if(shapes[i] instanceof Printable) { 
    shapes[i] 
} 
+3

試し 'Printable.class.cast(形状[i])と。印刷()'、あなたの形状[i]の[](そうでない場合は、あなたの 'instanceof'印刷可能でないタイプである可能性があり意味をなさないであろうし、その方法は自動的に完了する)。 – Philipp

+0

'shapes {]'の宣言された型は何ですか? –

+0

シェイプ配列(シェイプ)形状が – mrKapplan

答えて

3

あなたは形状がここに印刷可能であるかどうかをチェックしますが:

if(shapes[i] instanceof Printable){ 

あなたがやったことを知らないコンパイラ。 shapesShapeの配列であり、Printableを実装していないと考えています。あなたはコンパイラに "実際にを持っていることを確認してください。shape[i]ですので、印刷してください!"

それをどのように伝えるか?

キャスト!

if(shapes[i] instanceof Printable){ 
    ((Printable)shape[i]).print(); 
} 

この(type)value構文を使用したことがあります。 valueを強制的にtypeに変換します。おそらくfloatの値をintに変換するのに使ったでしょう。それはここで同じことです!場合は、印刷に

を呼び出すことはありません

if(shapes[i] instanceof Printable){ 
    shapes[i] 
} 

:印刷可能な実装

0

あなたのクラスは、それがちょうど右の方法も

これを持ってするのに十分ではありません、「印刷可能な実装」を宣言しなければなりませんあなたのベース配列の型はPrintableを実装していないクラスですが、あなたはPhilippが書いたものを使用するように変更することができます

class Base {} 

class Shape extends Base implements Printable { 
    void print()... 
} 

Base[] shapes = ....; 

if(shapes[i] instanceof Printable) { 
    Printable.class.cast(shapes[i]).print() 
} 

それとも

class Shape implements Printable { 
    void print()... 
} 

Shape[] shapes = ....; 

Shapes[i].print(); // no instanceof or cast necessary 
関連する問題