从Java代码访问对象类的const字段时为什么会出错

时间:2018-08-07 15:38:11

标签: java kotlin

从科特林docs

object Obj {
    const val CONST = 1
}

足以以Obj.CONST的身份从Java访问

但是类似的错误。

object StringUtils {
    const val UNESCAPE_HTML4 = "... ..."
    ......
}

使用Java代码

return StringUtils.UNESCAPE_HTML4;

错误

'UNESCAPE_HTML4' has private access in com.data.utils.StringUtils

必须使用StringUtils.INSTANCE.getUNESCAPE_HTML4(),然后没有错误。

点击该UNESCAPE_HTML4确实可以正确打开编译后的代码。

唯一的区别是此对象StringUtils来自于libray依赖项,该依赖项已添加到项目的build.gradle

有人也看到这种类型的错误吗?

这是Java端的测试功能,它试图从依赖库中访问这些功能(属性)。

public class DataWrapper {
    ... ...
    public void test_strUtil() {

    /*
     * For example, the string "<Français>"
     * will become "<Franais>"
     */

    String s = StringUtils.unescapeHtml4("<Français>");



    int s2 = Constants.CONTROLLER_FANTASY_SPORTS_STREAM;

    String[][] arr = EntityArrays.BASIC_UNESCAPE();

    Log.i("+++", "+++ test_strUtil(), after DataPlay.init(), unescapeHtml4:"+s+", empty:"
          +StringUtils.EMPTY+" --- s2:"+s2);

    for (int i=0; i<arr.length; i++) {
        String[] arrRow = arr[i];
        for (int j=0; j< arrRow.length; j++) {
            Log.w("+++", "+++ arrRow["+i+"]["+j+"]:"+arrRow[j]);
        }
    }
}

IDE在其上显示红色,并显示“非静态方法...”,

enter image description here

或者“具有私人访问权限...”

enter image description here

但是,当单击所抱怨的函数或属性时,它会打开正确的编译文件

enter image description here

enter image description here

运行时,打印输出显示正确调用的功能。

com.test.debug I/+++: +++ test_strUtil(), after DataPlay.init(), 
               unescapeHtml4:&lt;Fran&ccedil;ais&gt;, empty: --- s2:3
com.test.debug W/+++: +++ arrRow[0][0]:&quot;
    +++ arrRow[0][1]:"
    +++ arrRow[1][0]:&amp;
    +++ arrRow[1][1]:&
    +++ arrRow[2][0]:&lt;
    +++ arrRow[2][1]:<
    +++ arrRow[3][0]:&gt;
    +++ arrRow[3][1]:>

更奇怪的是,来自同一个库的其他函数和属性是通过不同对象类的const或@JvmStatic公开的,它们不会被IDE抱怨。

1 个答案:

答案 0 :(得分:1)

这里有几点:

  1. 该错误仅在IDE中出现,而不在编译过程中出现
  2. 仅当类在库中时发生(我试图在同一项目中重现类的问题,它可以按预期工作)

如果清理/重建无济于事,则应删除整个项目并再次导入。