Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态强制转换到每个数组类型_Java_Casting_Refactoring_Pmd_Static Code Analysis - Fatal编程技术网

Java 动态强制转换到每个数组类型

Java 动态强制转换到每个数组类型,java,casting,refactoring,pmd,static-code-analysis,Java,Casting,Refactoring,Pmd,Static Code Analysis,在任何可能的情况下,我都使用以下方法打印所有捆绑内容。问题是PMD同时报告和。我想改进代码,以消除警告,而不仅仅是消除它们 private static String bundleToString(Bundle bundle) { StringBuilder out = new StringBuilder("Bundle["); if (bundle == null) { out.append("null"); } else { bool

在任何可能的情况下,我都使用以下方法打印所有捆绑内容。问题是PMD同时报告和。我想改进代码,以消除警告,而不仅仅是消除它们

private static String bundleToString(Bundle bundle) {
    StringBuilder out = new StringBuilder("Bundle[");

    if (bundle == null) {
        out.append("null");
    } else {
        boolean first = true;
        for (String key : bundle.keySet()) {
            if (!first) {
                out.append(", ");
            }

            out.append(key).append('=');

            Object value = bundle.get(key);

            if (value instanceof int[]) {
                out.append(Arrays.toString((int[]) value));
            } else if (value instanceof byte[]) {
                out.append(Arrays.toString((byte[]) value));
            } else if (value instanceof boolean[]) {
                out.append(Arrays.toString((boolean[]) value));
            } else if (value instanceof short[]) {
                out.append(Arrays.toString((short[]) value));
            } else if (value instanceof long[]) {
                out.append(Arrays.toString((long[]) value));
            } else if (value instanceof float[]) {
                out.append(Arrays.toString((float[]) value));
            } else if (value instanceof double[]) {
                out.append(Arrays.toString((double[]) value));
            } else if (value instanceof String[]) {
                out.append(Arrays.toString((String[]) value));
            } else if (value instanceof CharSequence[]) {
                out.append(Arrays.toString((CharSequence[]) value));
            } else if (value instanceof Parcelable[]) {
                out.append(Arrays.toString((Parcelable[]) value));
            } else if (value instanceof Bundle) {
                out.append(bundleToString((Bundle) value));
            } else {
                out.append(value);
            }

            first = false;
        }
    }

    out.append(']');
    return out.toString();
}
我试图用下面的逻辑将代码分成两部分,但是
NcssCount
CyclomaticComplexity
刚刚转移到执行所有数组转换的新方法

if (value != null && value.getClass().isArray()) {
   // the new method to call all the array casts
   newMethodThatSuffersFromTheSameProblem(out, value);
} else if (value instanceof Bundle) {
    out.append(bundleToString((Bundle) value));
} else {
    out.append(value);
}
我可以对每种数组类型进行动态强制转换吗

if (value != null && value.getClass().isArray()) {
   out.append(Arrays.toString((<cast-to-class-array-[]>) value));
}
if(value!=null&&value.getClass().isArray()){
out.append(array.toString(()值));
}
我还尝试了out.append(Arrays.toString(value.getClass().cast(value))但获取编译错误
无法解析方法“toString(capture
这三个
if
s可以替换为一个

} else if (value != null && value.getClass().isArray())
  out.append(Arrays.toString((Object[]) value));
对于其余部分,您可以使用静态
映射转换器
,并将其预填充为

convertors.put(int[].class, value -> Arrays.toString((int [])value));
...
然后使用

Function<Object, String> convertor = convertors.get(value.getClass());
if (convertor != null) {
  out.append(convertor.apply(value));
} else ...
ToString convertor = convertors.get(value.getClass());
if (convertor != null) {
  out.append(convertor.convert(value));
} else ...
这三个
if
s可以替换为一个

} else if (value != null && value.getClass().isArray())
  out.append(Arrays.toString((Object[]) value));
对于其余部分,您可以使用静态
映射转换器
,并将其预填充为

convertors.put(int[].class, value -> Arrays.toString((int [])value));
...
然后使用

Function<Object, String> convertor = convertors.get(value.getClass());
if (convertor != null) {
  out.append(convertor.apply(value));
} else ...
ToString convertor = convertors.get(value.getClass());
if (convertor != null) {
  out.append(convertor.convert(value));
} else ...

我现在不能测试它,但是它怎么了

if (value == null) {
   // do whatever you want;
} else if (value instanceof Bundle) {
   out.append(bundleToString((Bundle) value));
} else if (value.getClass().isArray()) {
   out.append(Arrays.toString((Object[]) value));
} else {
   out.append(value);
}
顺便说一句:NCS和相关参数都是提示。如果你有20个不同的案例,你就有了。虽然你总是应该考虑太大的数字,但有时@SuppressWarning是正确的解决方案


顺便说一句,为什么要创建一个静态bundleToString(Bundle)而不是重写Bundle.toString()?

我现在不能测试它,但是它有什么问题吗

if (value == null) {
   // do whatever you want;
} else if (value instanceof Bundle) {
   out.append(bundleToString((Bundle) value));
} else if (value.getClass().isArray()) {
   out.append(Arrays.toString((Object[]) value));
} else {
   out.append(value);
}
顺便说一句:NCS和相关参数都是提示。如果你有20个不同的案例,你就有了。虽然你总是应该考虑太大的数字,但有时@SuppressWarning是正确的解决方案


顺便说一句:创建静态bundleToString(Bundle)而不是重写Bundle.toString()?

的原因是什么?尽管解决方案看起来清晰而漂亮
convert.apply(value)
需要Android API 24及以上版本:(我不熟悉Android。它是缺少lambdas还是仅仅是
函数
接口?两者都有解决办法,但如果它没有lambdas,那么你将不得不编写更多的样板代码。
函数
接口是个问题,它只在Android 7.0(牛轧糖,API 24)上可用,我目前的目标是4.4。)(KitKat)。因此,您只需定义自己的函数接口
接口函数{R apply(T input);}
我更新了答案,以提供无lambdas的映射和
函数
接口。尽管解决方案看起来清晰美观
convert。apply(value)
需要Android API 24及以上版本:(我不熟悉Android。它是缺少lambdas还是仅仅是
函数
接口?两者都有解决办法,但如果它没有lambdas,那么你将不得不编写更多的样板代码。
函数
接口是个问题,它只在Android 7.0(牛轧糖,API 24)上可用,我目前的目标是4.4。)(KitKat)。所以您只需要定义自己的函数接口
接口函数{R apply(T input);}
我更新了答案,提供了不带lambdas的映射,并且
函数
接口
Bundle
是来自Android框架的一个类…即使您能够扩展它并进行覆盖,在这种情况下,系统将返回它自己的类。
Bundle
是来自Android框架的一个类…即使您能够扩展它并执行重写,在这种情况下,系统将返回自己的类。