代码的目的
通过在DataStoragePics
类中将现有的一组像素(以返回二维数组的方法的形式)与之比较,找出屏幕上的图片。
我是如何解决的
DataStoragePics
。{/ li>中存储了methodStorage[]
类中的所有方法
methodStorage[]
调用一个方法,然后将其存储在tempMatrix[][]
中。 我需要帮助
当我尝试使用上面提到的步骤解决问题时,我在主类的底部第三行出现错误,重复两次:
此行有多个标记 - 类型不匹配:无法从Object转换为int。
我认为问题是methodStorage[x].invoke(DataStoragePicsObj)
是一个单独的数组,但它返回一个二维数组,程序无法识别,所以它需要tempMatrix
是一个简单的数组或者methodStorage[]
是一个2D数组。我需要帮助解决这个错误。
这是Main
类:
import java.lang.reflect.Method;
int [][] tempMatrix = new int[16][450];
//Creates a DataStoragePics Object.
DataStoragePics DataStoragePicsObj = new DataStoragePics();
//Stores all DataStoragePics methods in methods[].
Method[] methodStorage = DataStoragePicsObj.getClass().getMethods();
//Loops through methodStorage[].
for(int x = 0; x < method.length; x++)
{
//Stores a 2D array from DataStoragePics class in tempMatrix.
//All methods in DataStoragePics return a 2D array with [16][10] dimensions.
/*This is the error line*/
tempMatrix[16][10] = methodStorage[x].invoke(DataStoragePicsObj);
/*above is the error line*/
}
这是DataStoragePics
类的一部分:
public class DataStoragePics
{
public int[][] picXYZ()
{
int[][] rgbValues =
{
{1,2,3,4},
{9,8,7,6}
};
return rgbValues;
}
}
对于java /编码我是初学者所以请不要使用复杂的术语。
教学大纲的答案有所帮助,但我仍然收到这个错误:&#34;线程中的异常&#34; main&#34; java.lang.ClassCastException:java.lang.Class不能转换为[[I&#34;事情是铸造,它存储并返回屏幕上的东西。有时它有时会在中间显示错误。不知道为什么。
答案 0 :(得分:1)
实际上,没有“强制转换”,编译器只会认为invoke
返回Object
。
tempMatrix[16][10]
表示tempMatrix
数组中的元素(16,10),因此其类型为int
。
因此,将一个Object分配给一个int会引发编译器错误:在“=”之后的类型必须是“相同”。
首先,您必须将通过调用返回的Object强制转换为int[][]
。
那么你必须分配一个int [] []对象(完整的tempMatrix?)
tempMatrix = (int[][]) methodStorage[x].invoke(DataStoragePicsObj);
答案 1 :(得分:1)
您正在循环遍历班级中的所有方法。并将每个方法的返回值转换为int[][]
。
Method[] methodStorage = DataStoragePicsObj.getClass().getMethods();
//Loops through methodStorage[].
for(int x = 0; x < method.length; x++)
这当然会失败,因为您的DataStoragePicsObj
类会隐式扩展java.lang.Object
,其hashCode
,toString
和getClass
等方法不会返回int[][]
。
如果你通过反射调用一个方法,你应该准备好传递正确的参数和它返回值的过程;如果不能,则不应通过反射调用该方法。
你能做什么 - 如果我对你想要做的事情的理解是正确的 - 是检查返回类型和参数,以确保你准备好处理反射调用:
Method m = methodStorage[x];
if (m.getReturnType() != int[][].class || m.getParameterTypes().length != 0) {
// Skip this method because it requires arguments or doesn't return int[][]
continue;
}