【问题标题】:Array type expected; found: 'java.util.map<java.lang.String,java.lang.String>'预期的数组类型;找到:'java.util.map<java.lang.String,java.lang.String>'
【发布时间】:2019-10-06 20:30:41
【问题描述】:

我的变量是第一类,例如:

MyClass{
    companion Object{
        @JvmField val foo = mapOf("a" to "b")
    }
}

当我从另一个类中调用它时:

setBackgroundColor(Color.parseColor(MyClass.foo["..."]));

出现错误提示“预期数组类型;找到:'java.util.map '" 有什么问题?

请注意,如果我在 MyClass 中执行相同的调用,它会完美运行

这些是错误:

这是我真正的数组值:

companion object{
    @JvmField val darkMode = mapOf(
        "bgColor" to "#000000",
        "cardColor" to "#262626"
    )
}

当我从扩展 RecyclerView.ViewHolder 的类中调用它时出现错误

【问题讨论】:

  • 它需要一个字符串。
  • 我没有在答案中指定地图类型,现在更新@TaseerAhmad
  • 你正在创建一个Pairto 是一个中缀函数,它创建一个Pair
  • 那么问题出在哪里?我需要一个关联数组@TaseerAhmad
  • 显示更多调用代码。你是从哪里打电话来的?代码中的 setBackgroundColor 是什么?那是风景吗?

标签: java android kotlin


【解决方案1】:

我刚试过这个:

        val foo = mapOf("a" to "Red")
        someView.setBackgroundColor(Color.parseColor(foo["a"]))

它运行良好,你能分享更多关于异常的细节吗?

更新

我尝试完全按照所写的方式使用您的 MyClass,但我已将 a 的值替换为 Red 而不是您的 b 字符串。

您是否正确使用parseColor

    /**
     * </p>Parse the color string, and return the corresponding color-int.
     * If the string cannot be parsed, throws an IllegalArgumentException
     * exception. Supported formats are:</p>
     *
     * <ul>
     *   <li><code>#RRGGBB</code></li>
     *   <li><code>#AARRGGBB</code></li>
     * </ul>
     *
     * <p>The following names are also accepted: <code>red</code>, <code>blue</code>,
     * <code>green</code>, <code>black</code>, <code>white</code>, <code>gray</code>,
     * <code>cyan</code>, <code>magenta</code>, <code>yellow</code>, <code>lightgray</code>,
     * <code>darkgray</code>, <code>grey</code>, <code>lightgrey</code>, <code>darkgrey</code>,
     * <code>aqua</code>, <code>fuchsia</code>, <code>lime</code>, <code>maroon</code>,
     * <code>navy</code>, <code>olive</code>, <code>purple</code>, <code>silver</code>,
     * and <code>teal</code>.</p>
     */
    @ColorInt
    public static int parseColor(@Size(min=1) String colorString) {
        if (colorString.charAt(0) == '#') {
            // Use a long to avoid rollovers on #ffXXXXXX
            long color = Long.parseLong(colorString.substring(1), 16);
            if (colorString.length() == 7) {
                // Set the alpha value
                color |= 0x00000000ff000000;
            } else if (colorString.length() != 9) {
                throw new IllegalArgumentException("Unknown color");
            }
            return (int)color;
        } else {
            Integer color = sColorNameMap.get(colorString.toLowerCase(Locale.ROOT));
            if (color != null) {
                return color;
            }
        }
        throw new IllegalArgumentException("Unknown color");
    }

更新 2:

好的,你说的是“一个扩展 RecyclerView.ViewHolder 的类”,但所说的类只是 RecyclerView 类中的一个抽象类,所以它里面没有 setBackgroundColor,除非你正在做类似的事情:

yourViewHolderInstance.itemView.setBackgroundColor.

那么你的 setBackgroundColor 的签名是什么?

看起来像public void setBackgroundColor(@ColorInt int color) { 吗?

我只是为了好玩才将它添加到我的应用程序中:

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        (holder as BaseViewHolder).bind(getItem(position))

// For Filippo :)
holder.itemView.setBackgroundColor(Color.parseColor(MyClass.foo["a"]))
    }

嗯……现在一切看起来都很红。 :)

更新 3

好的,根据您上次的更新,您是从 Java 调用它,因此您不能使用 Kotlin 语法...

这样做:

        final Map<String, String> foo = MyClass.foo;
        yourView.setBackgroundColor(Color.parseColor(foo.get("a")));

显然,您可以避免中间分配并继续:

        v.setBackgroundColor(Color.parseColor(MyClass.foo.get("a")));

我通常更喜欢前者,特别是如果你给它所有有意义的名字并且需要调试,但就我而言并没有真正的区别。

【讨论】:

  • 如果我这样做它工作正常,当我从另一个不在同一个文件中的类调用 foo 时问题就来了
  • 我从另一个班级调用它,就像你的一样,它可以工作。 a 的值是多少? parseColor 需要一个类似于 "Red" 的字符串,比如 #FFFFFF
  • 我在问题中输入的值只是示例,这是真正的值"bgColor" to "#000000",但我认为问题不在于值,我的意思是,为什么它期望收到一个数组地图不是数组吗?
  • 谁在打电话给setBackgroundColor?那是view.setBack... 还是?如果您控制(或 macOS 上的 cmd)单击方法 (setBackgroundColor),您会看到哪些签名?如有疑问,不要像那样打包代码,而是将其分隔在不同的行中,您可以调试并查看...
  • 查看更新 3...您从未说过您是从 Java 调用它的 :)
猜你喜欢
  • 2021-06-27
  • 2012-12-28
  • 2020-02-27
  • 2018-10-16
  • 2019-05-17
  • 1970-01-01
  • 2019-07-27
  • 2012-06-02
  • 1970-01-01
相关资源
最近更新 更多