Programing

두 개의 Java 메소드가 다른 리턴 유형으로 동일한 이름을 가질 수 있습니까?

lottogame 2020. 9. 21. 22:18
반응형

두 개의 Java 메소드가 다른 리턴 유형으로 동일한 이름을 가질 수 있습니까? [복제]


이 질문에 이미 답변이 있습니다.

두 개의 Java 메소드가 다른 리턴 유형으로 동일한 이름가질 수 있습니까 ? 메서드의 반환 유형이 다르며 동일한 메서드 이름으로 선언됩니다.

허용됩니까?


두 메소드가 동일한 매개 변수 유형을 가지고 있지만 반환 유형이 불가능한 경우와 다를 경우. 에서 Java 언어 사양, 자바 SE 8 판, §8.4.2. 방법 서명 :

두 메서드 또는 생성자 M과 N은 동일한 이름, 동일한 형식 매개 변수 (있는 경우) (§8.4.4) 및 형식 매개 변수에 N의 형식 매개 변수 형식을 적용한 후 동일한 서명을 갖습니다. M의 동일한 형식 매개 변수 유형입니다.

두 방법 모두 매개 변수 유형이 다르면 (따라서 서로 다른 서명이 있음) 가능합니다. 이를 과부하라고합니다.


다른 매개 변수를 허용하는 경우에만 해당됩니다. 매개 변수가 없으면 다른 이름을 가져야합니다.

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


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

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

자세한 내용은 여기에서 내 기사를 읽으십시오.


No. C++ and Java both disallow overloading on a functions's return type. The reason is that overloading on return-type can be confusing (it can be hard for developers to predict which overload will be called). In fact, there are those who argue that any overloading can be confusing in this respect and recommend against it, but even those who favor overloading seem to agree that this particular form is too confusing.


You can have two methods with the same arguments and different return types only if one of the methods is inherited and the return types are compatible.

For example:

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

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

Only if their parameter declarations are different from memory.


The java documentation states:

The compiler does not consider return type when differentiating methods, so you cannot declare two methods with the same signature even if they have a different return type.

See: http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html


Even if it is an old thread, maybe some is interested.

If it is an option to you to use the same method inside the same class and archive different return types, use generics: Oracle Lesson Generics

Simple example for generic value holder class:

class GenericValue<T> {
  private T myValue;

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

  public T getVal() { return myValue; }
}

And use it like this:

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());
  }
}

... will result in the following output:

I: 10
S: go on ...

If it's in the same class with the equal number of parameters with the same types and order, then it is not possible for example:

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

if the number of parameters and their types is same but order is different then it is possible since it results in method overloading. It means if the method signature is same which includes method name with number of parameters and their types and the order they are defined.

참고URL : https://stackoverflow.com/questions/5561436/can-two-java-methods-have-same-name-with-different-return-types

반응형