2

이 질문은 구가 어렵 기 때문에 몇 가지 코드 샘플을 사용해야 할 것입니다. 기본적으로, 나는 오버로드 된 마지막 매개 변수 3 개를 취하는 (오버로드 된) 메서드를 가지고있다. 마찬가지로, 마지막 매개 변수는 String이고, 때로는 double 등입니다. 마지막 매개 변수로 삼항 조건식을 사용하여이 메서드를 호출하여 특정 값에 따라 double 또는 a를 전달합니다. 끈. 다음은 그 예입니다 ...Java에서 메소드 호출 매개 변수 중 하나에 대해 조건부 유형을 허용하도록하려면 어떻게해야합니까?

오버로드 방법 헤더 :

The method writeToCell(int, int, double) in the type MyType is not applicable 
for the arguments (int, int, Object&Comparable<?>&Serializable) 
:

writeToCell(2, 4, myValue != null ? someDouble : someString); 

이것은, 그러나, 컴파일 오류가 발생합니다 : 내가 할 노력하고있어

writeToCell(int rowIndex, int colIndex, double value) 

writeToCell(int rowIndex, int colIndex, String value) 

Java가 "충분히 똑똑하지 않다"(또는 단지 목적에 맞게 기능이 구현되지 않은 것 같습니다) 그녀의 선택권에는 그것을 지원하는 방법이있다. 내 질문은 - 이것을 할 방법이 있습니까? double (String) (예 : writeToCell(2, 4, myValue != null ? someDouble.toString() : someString);)을 전달하여 시뮬레이션 할 수 있지만이 메서드는 double 데이터 형식으로 받아 들여야합니다.

로직은 Java가이 문장을 받아들이도록 강요 할 수는 없다고 말합니다 ...하지만 나에게 훨씬 명확한 코드가 나오므로 시도해 볼 가치가 있습니다. 누구든지이 일을하는 방법을 알고 ...?

+0

네이티브 형식을 개체와 함께 사용할 수 없습니다. 그것들을 박스에 넣는다. –

답변

0

여러분의 제안과 설명 모두에게 감사드립니다.

광산 동료가 내 코드를 살펴보고 구현 한 솔루션을 제안했습니다. 내 두 방법의 시작 부분에 다음 코드를 삽입 :

if(value == null){ 
    writeToCell(rowIndex, colIndex, someString) 
} 
else{ 
    ...method body... 
} 

나는이 구현은 항상 좋은 생각되지 않을 수도 있음을 알고 있지만이에 double 값을 전달할 때 나는 거의 항상 null을 확인 할 필요가 있기 때문에 방법을 사용하면이 상황에서 가장 의미가 있습니다. 이 방법은 매번 체크 코드 (/ 삼원 진술)를 반복 할 필요가 없으며 메서드 호출이 훨씬 깔끔합니다.

-1

삼항 연산자는 "then"또는 "else"절에서 같은 유형을 반환해야합니다. 당신이 Double 대신 double를 처리 할 수있는 경우에, 당신은

Object o = (myValue != null ? someDouble : someString); 
writeToCell(2, 4, o); 

을 시도하고 (int, int, Object) 인수를 받아들이는 writeToCell 방법을 변경할 수 있습니다.

+0

사실이 아닙니다. 당신은 그 위치에있는 다른 유형을 가질 수 있습니다. 시도 해봐! –

+0

나는 가지고있다, 그러나 과거에는; Java 5 또는 6의 새로운 기능입니까? – Tenner

+0

Java 5에서 자동 보봇 (autoboxing)이 도입 된 이래로 모든 유형을 Object로 변환 할 수있었습니다. 이전에는 실제로는 그렇지 않았고 3 진 연산자에서 기본 유형과 참조 유형을 혼합하여 컴파일 타임 오류가 발생했습니다. –

4

메소드 호출은 런타임에 동적으로 컴파일되지 않고 정적으로 처리됩니다. 따라서 컴파일러는 사용자가 볼 수있는 것처럼 해당 식의 가능한 인수 모두와 일치하는 형식을 찾고 있습니다.

당신은 SDK가 많이 무엇을 수행하고

writeToCell(int rowIndex, int colIndex, Object value) 

로 방법을 정의한 다음 첫 번째 라인은 다른 솔루션의 많음이있다

final String repr = String.valueOf(value); 

수있다, 그러나 그건 수 이것을 과장하지 않는 것이 가장 좋습니다.

데모 : 방법 조회가 동적이라면

static class WrongAgain 
{ 
    void frob(final Object o) 
    { 
     System.out.println("frobo " + o); 
    } 

    void frob(final String s) 
    { 
     System.out.println("frobs " + s); 
    } 

} 

public static void main(final String[] args) 
{ 
    final WrongAgain wa = new WrongAgain(); 
    wa.frob("foo"); 
    Object o = "foo"; 
    wa.frob(o); 
} 

, 다음은 "frobs"두 번 볼 것. 그것은 정적입니다.

+1

메서드 호출 *은 런타임에 동적으로 확인됩니다 (그렇지 않으면 메서드 무시가 작동하지 않습니다). 그것은 컴파일 타임에 발생하는 오버로드 된 메소드들 사이의 선택 일뿐입니다. –

+0

올바르지 않습니다. 데모를보십시오. –

+0

이 솔루션을 생각해 봤지만 오버로드 된 메서드는 데이터 형식에 따라 약간 다른 작업을 수행하므로 일반 Object 메서드를 하나만 만들 수는 없습니다. 그렇기 때문에 나는 처음에 다른 방법을 가지고 있습니다. – froadie

0

나는 개체 유형 (따라서 호출해야하는 오버로드 된 버전)이 컴파일 타임에 결정될 수 없기 때문에 그것이 질식하는 것으로 의심된다. 비슷한 의미 :

Object o = myValue != null ? someDouble : someString; 
writeToCell(2, 4, o); 
3

특별한 이유가 있습니까?

if (myValue == null) 
    writeToCell(2, 4, someString); 
else 
    writeToCell(2, 4, someDouble); 
+0

예. 여러 가지 이유로 같은 일을해야하는 일련의 메서드 호출이 있고 (그리고 여러 가지 이유로 루프에있을 수는 없습니다) 코드를 더 길고 복잡하게 작성하게 될 것입니다. – froadie

+0

_THAT_가 코드를 길고 복잡하게 만들면 심각한 리펙토링이 필요합니다! –

0

3 진 연산의 반환 유형이 String과 autoboxed double의 공통 수퍼 클래스 인 java.lang.Object에 업 캐스트되고 있으므로 객체에 메소드 서명을 제공해야합니다. 해당 캐스트를 만들고 관련 메서드를 호출하는 방법은 다음과 같습니다.

public class SoCast { 


public static void main(String[] args) { 
    SoCast sc = new SoCast(); 

    Double someDouble = 3.14; 
    String someString = "foo"; 
    String myValue = null; 

    sc.writeToCell(2, 4, myValue != null ? someDouble : someString); 

    myValue = "hello"; 

    sc.writeToCell(2, 4, myValue != null ? someDouble : someString); 

} 

private int writeToCell(int rowIndex, int colIndex, Object value) { 
    int result = -1; 
    if (value instanceof String) { 
    result = this.writeToCell(rowIndex, colIndex, (String) value); 
    } else if (value instanceof Double) { 
    result = this.writeToCell(rowIndex, colIndex, (Double) value); 
    } 
    return result; 
} 

private int writeToCell(int rowIndex, int colIndex, Double value) { 
    return 1; 
} 

private int writeToCell(int rowIndex, int colIndex, String value) { 
    return 5; 
} 
}