2014-02-18 3 views
0

다양한 형식의 개체를 받아 들일 수있는 메서드를 만들고, 전달되는 개체에 toString을 수행 한 다음 인쇄합니다. 때로는 int, 때로는 길거나 때로는 문자열, 때로는 사용자 정의 객체 등이 될 수도 있습니다. 유일한 주장은 toString() 메서드를 가져야한다는 것입니다. 기본적으로, 나는 메소드를 사용할 때마다이 API 외부에서 toString()을 호출하지 않고 파이썬의 오리 - 타이핑을 시뮬레이트하고 싶다.toString() 메서드를 사용하여 개체로 매개 변수를 받아들입니다.

/** 
* Log a message at TEST level 
* @param message: An object of any class that implements toString. 
*/ 
public void test(Class<?> message) { 
    String messageString = message.toString(); 
    log(Level.TEST, messageString); 
} 

이 구문이 올바른 것 같다,하지만 내가 원하는 것을 제공하지 않습니다

여기
/** 
* Log a message at TEST level 
* @param message: The message to log 
*/ 
public void test(String message) { 
    log(Level.TEST, message); 
} 

지금까지 그것을 강화하는 시도에서 내가 가진 무엇 :

은 기존 기능이었다 :

Cannot resolve method 'test(int)' 

Java에서이 기능을 수행하는 올바른 방법이 있습니까?

+2

이 메서드는 프리미티브를 제외한 모든 형식에서 작동합니다. 그리고 원시 타입은'toString()'메소드를 가지고 있지 않기 때문에 당신도 그것을 기대하지 말아야한다. –

+0

원시 타입은 클래스의 객체가 아니기 때문에 클래스와 함께 동작하지 않습니다. Integer 클래스 등을 사용할 수 있습니다 ... –

+0

@GiladNaaman 나는 아무 소용이없는 것을 시도했습니다. 'test (java.lang.Integer)'메서드를 해결할 수 없습니다. –

답변

5
public void test(Object message) { 
    log(Level.TEST, message.toString()); 
} 

Autoboxing은 기본 문자를 처리합니다. 공정한 경고 : 많은 (대부분?) toString() 메소드의 기본 출력은 Object.toString() 메소드로 연기되기 때문에 읽기가 쉽지 않습니다.

+0

흠. "Java 컴파일러는 기본 값이 해당 래퍼 클래스의 개체를 예상하는 메서드에 매개 변수로 전달 될 때 autoboxing을 적용합니다." 분명히 와일드 카드가 해결되지 않으므로 래퍼 클래스 기대가 명시 적이어야합니다. 감사. –

+0

@Decency 그건 당신 문제가 아니야. 귀하의 문제는 귀하가 제네릭을 올바르게 사용하지 않는다는 것입니다. 제네릭을 올바르게 사용한 경우에도 Object에서 확장되는 제네릭을 사용하는 것은 의미가 없습니다. 그냥 개체 참조를 사용하십시오. –

2

java.lang.Object에는 어떤 클래스도 toString() 메서드가 있습니다. 그러므로 당신의 주장은 ... 무의미합니다.

@Kevin에서 설명한대로 Class clazz 대신 Object message을 사용하면됩니다. :)

관련 문제