Javaクラス/インターフェースのメソッドシグネチャには、戻り値の型が含まれていますか?
例:
Javaはこれら2つのメソッドの違いを知っていますか?
public class Foo {
public int myMethod(int param) {}
public char myMethod(int param) {}
}
それとも、問題になるのはメソッド名とパラメータリストだけでしょうか?
Javaクラス/インターフェースのメソッドシグネチャには、戻り値の型が含まれていますか?
例:
Javaはこれら2つのメソッドの違いを知っていますか?
public class Foo {
public int myMethod(int param) {}
public char myMethod(int param) {}
}
それとも、問題になるのはメソッド名とパラメータリストだけでしょうか?
回答:
Oracle Docsからの引用:
定義:メソッド宣言の2つのコンポーネントは、メソッドシグネチャ(メソッドの名前とパラメータータイプ)で構成されます。
この例を含むように質問が編集されたので、
public class Foo {
public int myMethod(int param) {}
public char myMethod(int param) {}
}
いいえ、シグネチャmyMethod(int param)
は同じなので、コンパイラは違いを認識しません。2行目:
public char myMethod(int param) {}
エラーが発生します:メソッドはすでにclassで定義されています。これにより、上記のステートメントがさらに確認されます。
foo.bar(baz);
か?
Javaのクラスメソッドシグネチャには戻り値の型が含まれていますか?
Javaではそうしませんが、このJVMではそうします。これは明らかな混乱を招きます。
Javaのインターフェイスメソッドシグネチャには戻り値の型が含まれていますか?
クラスメソッドと同じです。
または、メソッド名とパラメータリストのみですか?
Javaのメソッド名とパラメータータイプ。たとえば、パラメータの注釈と名前は重要ではありません。
バイトコードレベルでは、「戻り値の型」はメソッドシグネチャの一部です。このことを考慮
public class Test1 {
public Test1 clone() throws CloneNotSupportedException {
return (Test1) super.clone();
}
}
バイトコードには2つのclone()メソッドがあります
public clone()LTest1; throws java/lang/CloneNotSupportedException
public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException
戻り値のタイプのみが異なります。
いいえ、Javaではありません。メソッド名とパラメータリストはメソッドシグネチャ専用です。戻り値の型は含まれません。
Bro、Javaでは、名前とパラメーターでメソッドを呼び出すために使用します。
myMethod(20、40)
したがって、JAVAは、対応する宣言(name + param)で一致する類似のもののみを検索します。これが、メソッドシグネチャにメソッドの名前とパラメータのみが含まれている理由です。:)
いいえ、Javaではメソッドシグネチャに戻り値の型は含まれていませんが、宣言には含まれています。
public String getString(String myString)
^access modifier ^return type ^name ^parameter type and name
以下のフィードバックに基づいて編集:)
String method( String s )
とDouble method( String s )
同じクラスで、インスタンスのために。
method signature
していますmethod declaration
戻り値の型はメソッドシグネチャに含まれません。メソッド名とパラメータのみがメソッドシグネチャとして定義されます。
メソッドシグネチャには、戻り値のタイプが含まれます。
重複をチェックする必要がある場合、コンパイラはそれを無視します。Javaの場合、シグネチャが戻り値の型だけが異なる2つのメソッドを持つことは違法です。
それを試してください:
public class Called {
public String aMethod() {
return "";
}
}
public class Caller {
public static void main(String[] main) {
aMethod();
}
public static void aMethod() {
Called x = new Called();
x.aMethod();
}
}
プロジェクトをビルドし、binディレクトリに移動して、Caller.cassをどこかにコピーします。次に、呼び出されたメソッドを変更します。
public int aMethod() {
return 0;
}
プロジェクトをビルドすると、Called.classとCaller.classの両方に新しいタイムスタンプがあることがわかります。上記のCaller.classを置き換えて、プロジェクトを実行します。例外があります:
java.lang.NoSuchMethodError: it.prova.Called.aMethod()Ljava/lang/String;
メソッドのシグネチャは、メソッドの名前とパラメータのみです。ただし、同じクラスに属している場合、例ではエラーが発生すると思います。あなたは単に任意のIDEでそれをテストし、コンパイラがエラーをスローすることを確認できます
Eclipseで言及したコードを実行しようとすると、JavaコンパイラーがJavaメソッドを区別するためにどの要素を探すかについての答えが得られます。
class Foo {
public int myMethod(int param) {
return param;}
public char *myMethod*(int param) { //this line throws an error
return param;
}
}
スローされるエラーは次のとおりです:タイプFooの複製メソッドmyMethod(int)。