如何解决“非静态类T不能从静态上下文引用”?

时间:2013-03-14 10:10:09

标签: java

如何编写一个简单地接受任何类型参数的Java函数,打印并返回它?

在Scheme中我习惯编写以下宏:

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

调用(+ 1 (dump (* 2 3)))将返回7并打印(* 2 3) -> 6

我在Java中尝试过类似的东西:

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

如何解决这个问题?

修改 谢谢,我明白了:

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

可爱的方案我为你感到悲伤......

1 个答案:

答案 0 :(得分:5)

您将您的类实现为其他内部类。在这种情况下,您必须将班级标记为static

但是,真正的答案是:你根本不需要这个类,你只需要方法:

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

作为旁注,我在我的代码中使用相同的技巧,但我总是包含一个msg参数,以便于转储读取/ grepping:

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