【问题标题】:Non-static 'sleep(long)' cannot be referenced from a static context [duplicate]不能从静态上下文中引用非静态“睡眠(长)”[重复]
【发布时间】:2021-04-13 12:24:21
【问题描述】:

我正在尝试从我的 Utils 调用函数 sleep ,如下代码:

@Override
                        public void onError(String err) {
                            log("A pinger died");
                            if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_FAIL)) {
                                PingStream.this.onError(err);
                                return;
                            }
                            if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_ATTEMPT_RESTART) || errorHandlingMode.equals(SpeedtestConfig.ONERROR_MUST_RESTART)) {
                                Utils.sleep(100);
                                init();
                            }
                        }

这是我拥有的全部功能:

private void init() {
        if (stopASAP) return;
        if (c != null) {
            try {
                c.close();
            } catch (Throwable ignored) {
            }
        }
        new Thread() {
            public void run() {
                if (pinger != null) pinger.stopASAP();
                if (remainingPings <= 0) return;
                try {
                    c = new Connection(server, connectTimeout, soTimeout, recvBuffer, sendBuffer);
                    if (stopASAP) {
                        try {
                            c.close();
                        } catch (Throwable ignored) {
                        }
                        return;
                    }
                    pinger = new Pinger(c, path) {
                        @Override
                        public boolean onPong(long ns) {
                            boolean r = PingStream.this.onPong(ns);
                            if (--remainingPings <= 0 || !r) {
                                onDone();
                                return false;
                            } else return true;
                        }

                        @Override
                        public void onError(String err) {
                            log("A pinger died");
                            if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_FAIL)) {
                                PingStream.this.onError(err);
                                return;
                            }
                            if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_ATTEMPT_RESTART) || errorHandlingMode.equals(SpeedtestConfig.ONERROR_MUST_RESTART)) {
                                Utils.sleep(100);
                                init();
                            }
                        }
                    };
                } catch (Throwable t) {
                    log("A pinger failed hard");
                    try {
                        c.close();
                    } catch (Throwable ignored) {
                    }
                    if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_MUST_RESTART)) {
                        Utils.sleep(100);
                        init();
                    } else onError(t.toString());
                }
            }
        }.start();
    }

我发现Non-static 'sleep(long)' cannot be referenced from a static context 出现编译时错误

这是我拥有的以下实用程序:

package com.live.flutter_telephony_rf_example.core.base

import java.net.URLEncoder

object Utils {
    fun urlEncode(s: String?): String? {
        return try {
            URLEncoder.encode(s, "utf-8")
        } catch (t: Throwable) {
            null
        }
    }

    fun sleep(ms: Long) {
        try {
            Thread.sleep(ms)
        } catch (t: Throwable) {
        }
    }

    fun sleep(ms: Long, ns: Int) {
        try {
            Thread.sleep(ms, ns)
        } catch (t: Throwable) {
        }
    }

    fun url_sep(url: String): String {
        return if (url.contains("?")) "&" else "?"
    }
}

屏幕截图错误:

【问题讨论】:

  • @Zoe 我不这么认为,但让我检查一下,谢谢你的建议
  • 我不认为它实际上是@Zoe。这个问题是关于 Kotlin/Java 互操作的。
  • 这里的解决方案是使用Utils.INSTANCE.sleep(...)。在 Kotlin 中,伴生对象是单例,而不是它们的方法是静态的。因此,在 Java 中,您必须执行检索单例实例然后调用方法的额外步骤。
  • @HenryTwist 是的,正是我所说的,我认为他没有仔细阅读
  • 啊,我不应该回答@Zoe 抱歉。我将它作为重复投票。

标签: android kotlin singleton


【解决方案1】:

这里的问题是 Kotlin 根本没有静态方法。所以调用Utils.sleep(...) 不是一个有效的方法。

相反,Kotlin 有对象,这些对象被视为单例并被实例化。因此,当从 Java 调用时,您需要额外的步骤来检索 Kotlin 公开为 INSTANCE 的单例实例。所以是这样的:

Utils.INSTANCE.sleep(...);

作为替代解决方案,您还可以使用@JvmStatic 注释,这将允许将方法解释为静态:

@JvmStatic
fun sleep(...)

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 2023-03-31
    • 2023-03-22
    • 1970-01-01
    • 2011-05-12
    • 2013-12-02
    相关资源
    最近更新 更多