2013-10-20 4 views
0

Java에서 메소드 정의가 무언가를 리턴하면 해당 메소드를 호출하는 클래스는 해당 메소드의 리턴 값을 변수로 캡처하도록 준비해야합니다. 적어도 그것이 내가 논리적으로 이해하는 것입니다. 하지만 컴파일러가 불평하지 않는 이상한 상황이 있습니다.Java에서 캡처해야하는 값을 반환 할 것으로 예상되는 메서드 호출은 컴파일 오류를 발생시키지 않습니다. 왜?

나는 메서드가 정의 된 Animal 인터페이스가 있습니다. Animal 인터페이스를 구현하는 AnimalImpl 클래스 및 Animal 유형의 인스턴스 변수에 대해 composition을 사용하는 Lion 클래스입니다.

여기 코드가 있습니다. 컴파일러가 왜 광포하지 않을까요?

인터페이스 :

public interface Animal { 
    public int walk(int steps); 
    public int fly(int miles); 
    public void eat(String food); 
} 

구현 :

public class AnimalImpl implements Animal { 
    @Override 
    public int walk(int steps) { 

     return steps * 100; 
    } 
    @Override 
    public int fly(int miles) { 
     return miles/5; 
    } 
    @Override 
    public void eat(String food) { 
     System.out.println("Animal ate food: "+food); 

    } 
} 

클라이언트 :

public class Lion { 
    private Animal ani; 
    public String executeAnimalMethod(){ 
     ani = new AnimalImpl(); 
     ani.eat("carrots"); 
     ani.walk(100); 
     ani.fly(100); 
     return null; 
    } 
} 

어떻게 완 오류가 발생하지 않습니까? 왜 이런 경우입니까?

+0

컴파일 오류가 발생하지 않고 인쇄됩니다. – EJP

+1

Java에서 (C와 같이) 메소드 호출의 리턴 매개 변수를 무시하는 것이 합법적입니다. –

답변

4

메서드에서 반환 된 값을 사용해야한다는 언어 요구 사항이 아닙니다.

이러한 상황은 예를 들어, 정기적으로 자주 발생합니다

Set<Integer> set = new HashSet<Integer>(); 
set.add(1); // returned boolean ignored 

Set#add()가 세트가 주어진 매개 변수 (그것을 호출의 결과로 변경된 경우를 나타내는 부울 값을 반환 세트가 이미 포함 된 경우 false를 반환 값). 그러나 대부분의 경우 반환 값은 스 니펫 에서처럼 무시됩니다.

1

변수에 반환 값을 저장할 필요가 없습니다. 그것이 반환 되었기 때문에 당신이 그것을 주변에 두어야한다는 것을 의미하지는 않습니다.

0

작성한 모든 내용이 올바른 Java이기 때문에 컴파일러에서 오류가 발생하지 않습니다.

당신이 구체적으로 어디에서 컴파일러가 오류를 일으킬 것이라고 생각하는지 말하지 않았습니다. 더 많이 알지 못하는 한, 메소드에 호출자가 리턴해야하는 리턴 유형이 있기 때문에 메소드가 무언가에 그것을 지정해야한다고 생각한다고 가정 할 수 있습니다. Java는 그것을 전혀 시행하지 않습니다. 클래스의 클라이언트는 메소드를 호출하고 합법적으로 반환 값을 완전히 무시할 수 있습니다.

0

나는 아무도 그렇게 분주 한 사람을 보지 못했다고 말할 수있다. 오류가 발생한다.

먼저 Java는 메소드에서 반환 된 값을 강제로 캡처하지 않습니다.

둘째, 모든 Java 메소드가 값을 반환하지는 않습니다. 일부는 void입니다.

다른 것들을 수행하기 위해 반환 값을 캡처해야 할 필요가 있지만 그럴 필요는 없습니다.

걱정하지 마십시오. 당신이 나 같은 어떤 것이라면, 컴파일러와 런타임 로그가 곧 광포하게 될 것입니다. 그것이 지속되는 동안 그것을 즐겨라.

+0

감사합니다.이 모든 컴파일 된 언어 세계를 처음 접했습니다. 스크립팅 언어 배경에서 왔습니다. 감사합니다 –

+0

도와 드리겠습니다. 장점을 논할 수는 있지만 파이썬이나 루비 함수에서 결과를 포착하지 않는 것은 합법적입니다. Java와의 차이점은 함수가 항상 뭔가를 리턴한다는 것입니다 (Python에서는 None, Ruby에서는 nil). – Vidya

관련 문제