web-dev-qa-db-ja.com

2つのJavaメソッドに同じ戻り名の異なる名前を付けることはできますか?

2つのJavaメソッドに同じ名前と異なる戻りタイプを指定できますか?メソッドの戻り値の型は異なり、同じメソッドの名前で宣言されます。

それは許されますか?

82
jenifer

両方のメソッドのパラメータータイプが同じで、戻り値のタイプが異なる場合は不可能です。 Java言語仕様、Java SE 8 Edition、§8.4.2。メソッドシグネチャ

2つのメソッドまたはコンストラクターMとNは、同じ名前、同じ型パラメーター(存在する場合)(§8.4.4)、およびNの仮パラメーター型を型パラメーターに適合させた場合、同じシグネチャを持ちます。 Mの、同じ正式なパラメータタイプ。

両方のメソッドのパラメータータイプが異なる(つまり、シグネチャが異なる)場合、可能です。これはオーバーロードと呼ばれます。

79
uthark

異なるパラメーターを受け入れる場合のみ。パラメータがない場合は、異なる名前が必要です。

int doSomething(String s);
String doSomething(int); // this is fine


int doSomething(String s);
String doSomething(String s); // this is not
32
Kaivosukeltaja

JLSによると、Java 6/7コンパイラ(OracleのJDK、OpenJDK、IBMのJDK)の機能/バグのため、ジェネリックを使用する場合、同じメソッドシグネチャに対して異なる戻り値の型を使用できます。

public class Main {
    public static void main(String... args) {
        Main.<Integer>print();
        Main.<Short>print();
        Main.<Byte>print();
        Main.<Void>print();
    }

    public static <T extends Integer> int print() {
        System.out.println("here - Integer");
        return 0;
    }
    public static <T extends Short> short print() {
        System.out.println("here - Short");
        return 0;
    }
    public static <T extends Byte> byte print() {
        System.out.println("here - Byte");
        return 0;
    }
    public static <T extends Void> void print() {
        System.out.println("here - Void");
    }
}

プリント

here - Integer
here - Short
here - Byte
here - Void

詳細については、 こちらの記事を読んでください

19
Peter Lawrey

いいえ。C++とJavaはどちらも、関数の戻り値型のオーバーロードを許可しません。その理由は、return-typeでのオーバーロードは混乱を招く可能性があるためです(開発者がどのオーバーロードが呼び出されるかを予測するのは難しい場合があります)。実際、過負荷はこの点で混乱を招く可能性があると主張し、それに対して推奨する人もいますが、過負荷を好む人でさえ、この特定の形式が混乱しすぎることに同意するようです。

メソッドの1つが継承され、戻り値の型に互換性がある場合にのみ、同じ引数と異なる戻り値の型を持つ2つのメソッドを使用できます。

例えば:

public class A
{
    Object foo() { return null; }
}

public class B
    extends A
{
    String foo() { return null; }
}
4
TofuBeer

パラメータ宣言がメモリと異なる場合のみ。

2
Chris

Javaドキュメントには次のように記載されています。

コンパイラは、メソッドを区別するときに戻り値の型を考慮しません。したがって、戻り値の型が異なっていても、同じシグネチャで2つのメソッドを宣言することはできません。

参照: http://docs.Oracle.com/javase/tutorial/Java/javaOO/methods.html

2
Chris

古いスレッドであっても、興味がある人がいるかもしれません。

同じクラス内でsameメソッドを使用し、異なる戻り型をアーカイブするオプションがある場合は、ジェネリックを使用します。 Oracle Lesson Generics

ジェネリックバリューホルダークラスの簡単な例:

class GenericValue<T> {
  private T myValue;

  public GenericValue(T myValue) { this.myValue = myValue; }

  public T getVal() { return myValue; }
}

そして、次のように使用します:

public class ExampleGenericValue {
  public static void main(String[] args) {
    GenericValue<Integer> intVal = new GenericValue<Integer>(10);
    GenericValue<String> strVal = new GenericValue<String>("go on ...");

    System.out.format("I: %d\nS: %s\n", intVal.getVal(), strVal.getVal());
  }
}

...は、次の出力になります。

I: 10
S: go on ...
2
ChristophS

同じ型と同じ順序で同じ数のパラメータを持つ同じクラスにある場合、たとえば次のことはできません。

int methoda(String a,int b) {
        return b;
}
String methoda(String b,int c) {
        return b;    
}

パラメータの数とタイプが同じで順序が異なる場合、メソッドのオーバーロードが発生するため、可能です。これは、メソッドのシグネチャが同じである場合、メソッド名とパラメーターの数、タイプ、および定義された順序が含まれていることを意味します。

1
unknown