2

そのため、このコードは、開発を停止したプロジェクト用の小片のフォルダーに入れられました。ただし、Java を初めて使用するので、いくつか質問があります (コードがコンパイルされないことはわかっていますが、それが私の質問の 1 つになります)。

interface Executable { 
   public int execute (Object o); 
} 

public class Biv implements Executable { 

   public int execute (String s) { 
     System.out.println (s); 
     return s.length(); 
   } 

   public static void main (String[] args) { 
     Executable e = new Biv(); 
     System.out.println( 
         e.execute ("Hello World!")); 
   }


}

1)私の最初の質問は、変数 e に関するものです。Executable オブジェクト タイプで宣言されていますが、新しい Biv オブジェクトでインスタンス化できる理由がわかりません。ここで何が起こっているのですか、それはどういう意味ですか?

2) Biv クラス内の execute メソッドにエラーがあります。これは、文字列ではなくオブジェクトを期待しているためと思われます。しかし、String は Object のサブクラスであるため、Object を String に置き換えることはできませんか? String を Object に置き換えた場合、エラーが発生することは理解できましたが (私は思います)、現在どのように行われているかはわかりません。

4

6 に答える 6

2

新しい Biv オブジェクトでインスタンス化できる理由がわかりません

Bivは を実装しているためExecutable、のインスタンスBivは のインスタンスでもありますExecutable

エラーは Biv クラス内の execute メソッドにあります

はい、[ Biv] 実装していませんexecute(Object)。このメソッドexecute(String)は、同じ署名を持っていないため、たまたま同じ名前を持つ別のメソッドです。インターフェイスを実装するすべてのクラスはExecutable、メソッドをオーバーライドする必要がありますexecute(Object)

安全ではないため、メソッドをオーバーライドするためのJavaの引数の共分散はありません。を呼び出したらどうなりますe.execute(new Object())か? [オブジェクトeを参照している場所]は、それをどうするかわかりません。BivBiv

于 2012-04-08T23:38:07.100 に答える
1

1)変数eは、Bivが実装するインターフェイスである実行可能ファイルとして宣言されます。つまり、Bivをインスタンス化できますが、実行可能ファイルとして保存し、実行可能ファイルとして渡すことができます。その変数は、実行可能ファイルとしてのみ扱うことができるようになりました。これがポリモーフィズムです。

2)これは、関数をオーバーライドし、署名に制限を追加しようとしているためです。これは、リスコフの置換原則に違反しています。関数については、基本的に「約束は少なくなく、必要はない」との原則があります。あなたがしていることは、インターフェースがそれがオブジェクトである可能性があると言ったときにパラメータを文字列にすることによって「もっと必要とする」ことです。次に、これを(1)に関連付けるために、mainのExecutableオブジェクトでexecute()メソッドが呼び出された場合、文字列のみを渡すように制限しないでください(Executableインターフェイスはexecute()がオブジェクトを取り込むことができると言っているため) )。

于 2012-04-08T23:43:55.297 に答える
0

メソッドをオーバーライドするのではなくExecutable(必須)、オーバーロードします(同じ名前、異なるパラメータータイプ)。

@Overrideエラーを強調するのに役立つ注釈を使用します。

public class Biv implements Executable { 

   @Override // This will cause an error to be highlighted saying this isn't overriding any method
   public int execute (String s) { 
     System.out.println (s); 
     return s.length(); 
   }
}
于 2012-04-08T23:42:02.933 に答える
0

ObjectクラスはtoString()メソッドを実装するため、キャストは必要ありません。文字列ではなくオブジェクトを受け取るようにBivを変更し、メソッドで最初にオブジェクトのtoString()を呼び出してから、文字列の長さを取得します。

interface Executable { 
   public int execute (Object o); 
} 

public class Biv implements Executable { 

   public int execute (Object s) { 
      System.out.println (s); 
      return s.toString().length(); 
   } 

   public static void main (String[] args) { 
      Executable e = new Biv(); 
      System.out.println( 
          e.execute ("Hello World!")); 
   }

}

ただし、いくつかのタイプの可能なパラメーターを受け入れるメソッドを作成するために、オブジェクトを使用してコマンドデザインパターンを実装することは一般的に悪い習慣です。パラメータインターフェイスの背後にパラメータをカプセル化するのが最善です。

于 2012-04-08T23:50:03.897 に答える
0

まず、この行について考えてみましょう。

public class Biv implements Executable

implements ExecutableクラスBivがの役割を果たすことができることを示しますExecutable。言い換えれば、Bivのすべてのメソッドの実装がありますExecutable

これは、後でこれを実行できる理由を説明しています。

Executable e = new Biv();

私はタイプの変数を持っておりExecutable、この機会にそのBiv実装を使用します。Bivインターフェイスを実装している場合Executable(そして、例で実装していることを宣言している場合)、これは問題ありません。

ここで、この例で問題が発生し始める場所に行きましょう。実行可能ファイルのインターフェースには、次のメソッド宣言が含まれています。

public int execute (Object o);

executeこれは、あなたが絶対に好きなものに電話して渡すことができるというObjectことです。しかし、好きなオブジェクトをのexecuteメソッドに渡すことはできますBizか?いいえ、渡すことができるのはString。そのため、Bizはインターフェイスを完全に満たしていません。

[円楕円問題]migthはさらに読んでおくとよいでしょう。1

于 2012-04-08T23:53:22.613 に答える
0

あなたが見ているのは、オブジェクト指向プログラムの基本概念の 1 つであるポリモーフィズムです。特定の質問 2 に答えるには、インターフェイスのメソッドの型シグネチャを一致させ (オブジェクトを引数として取ります)、それを String にキャストする必要があります。ただし、これ (キャスト) は Java では悪い習慣であり、可能な限り避ける必要があります。

于 2012-04-08T23:37:42.923 に答える