Из источника этих средств доступа кажется, что класс, объявляющий поле, нельзя назначить из класса runtimeInstance
:
if (! (This.field.getDeclaringClass ()).isAssignableFrom (paramObject.getClass ())))
throwSetIllegalArgumentException (paramObject);
field
- это поле, которое вы хотите получить из экземпляра, paramObject
- это ваш runtimeInstance
.
Таким образом, если объявленный класс поля не является классом или суперклассом paramObject, вы получите это сообщение.
Любой шанс, что ваш paramObject
являетсяInteger
здесь?
Редактировать: вот некоторый исходный код из OpenJDK (должен быть похож на Oracle), чтобы объяснить сообщение:
protected String getSetMessage(String attemptedType, String attemptedValue) {
String err = "Can not set";
if (Modifier.isStatic(field.getModifiers()))
err += " static";
if (isFinal)
err += " final";
err += " " + field.getType().getName() + " field " + getQualifiedFieldName() + " to ";
if (attemptedValue.length() > 0) {
err += "(" + attemptedType + ")" + attemptedValue;
} else {
if (attemptedType.length() > 0)
err += attemptedType;
else
err += "null value";
}
return err;
}
Принимая ваше сообщение java.lang.IllegalArgumentException: Can not set int field DataStructures.StackAr.topOfStack to java.lang.Integer
, мы находим, что:
- поле типа
int
- имя поля
topOfStack
в классе DataStructures.StackAr
attemptedType
равно java.lang.Integer
Поскольку attemptedType
является типом вашего runtimeInstance
, я подозреваю, classUnderTest
равен DataStructures.StackAr
, тогда как runtimeInstance
имеет тип java.lang.Integer
.