2013-03-14 2 views
3

모든 유형의 인수를 취하고이를 인쇄 한 다음 반환하는 Java 함수를 작성하는 방법은 무엇입니까? "정적이 아닌 클래스 T는 정적 컨텍스트에서 참조 할 수 없습니다"를 해결하는 방법은 무엇입니까?

는 계획에서 나는 다음과 같은 매크로를 작성하는 데 사용하고있다 :

(define-syntax dump 
    (syntax-rules() 
    ((_ arg) (let ((value arg)) 
       (display 'arg) 
       (display " -> ") 
       (display value) 
       (newline) 
       arg)))) 

(+ 1 (dump (* 2 3))) 7 및 인쇄 (* 2 3) -> 6을 반환 호출.

나는 자바에서 비슷한 시도 :

public class Debug<T> 
{ 
    public static T dump (T arg) 
    { 
     System.err.println (arg); 
     return arg; 
    } 
} 

을하지만 오류 얻을 :

non-static class T cannot be referenced from a static context 

방법이 문제를 해결하기를?

편집 덕분에 나는 그것을 가지고 : 당신은 다른 내부 내부 클래스로 클래스를 구현

+0

Object에서 가져 오기. –

+0

포옹 Clojure :) –

+0

@MarkoTopolnik 만약 내가 허용된다면 [Kawa] (http://www.gnu.org/software/kawa/)를 사용할 것입니다. – ceving

답변

5

내가 당신을 위해 슬퍼

import java.util.Arrays; 

public class Debug 
{ 
    public static <T> T dump (T arg) 
    { 
     System.err.println(arg instanceof Object[] ? 
          Arrays.toString((Object[])arg) : arg); 
     return arg; 
    } 
} 

사랑스러운 계획 .... 이 경우 클래스를 static으로 표시해야합니다.

하지만, 진짜 대답은 : 당신은 단지 방법이 필요로하는 모든 클래스가 필요하지 않습니다 : 내 코드에서 같은 트릭을 사용, 측면 참고로

public static <T> T dump(T arg) { ... } 

을하지만 덤프 읽기/그렙을 쉽게하기 위해 항상 msg 인수를 포함하십시오.

public static <T> T dump(String msg, T arg) { ... } 
+0

이것은 컴파일하지만 문자열을 인쇄하지 않습니다. 대신'[Ljava.lang.String; @ b28f30'을 출력합니다. – ceving

+0

arg.oString()을 인쇄하십시오. 하지만 다시 객체의 toString() 구현에 따라 달라집니다. – rajesh

+1

@ceving 배열은 Java의 특별한 경우입니다. 그것들은 의미있는'toString' 구현을 가지고 있지 않습니다. 만약 당신이 그들을 처리 할 필요가 있다면'System.out.println (msg + (arg instanceof Object []? Arrays.toString ((Object []) arg) : arg))); ' –

관련 문제