我正在尝试使用Objective-C(IPhone应用程序)中的一些代码在Android中构建应用程序。我正在尝试了解究竟是在做一段代码并将其转换为Java代码,但我想我需要一点帮助。首先,这里是Obj-C代码:
(BOOL)processSqlInjectQueries:(NSArray *)injectQueries error:(NSError**)error {
//some code
for(NSDictionary * q in injectQueries)
{
if (![q isKindOfClass:[NSDictionary class]]) continue;
StPacketInjectQueryPackage qType = (StPacketInjectQueryPackage)[[q objectForKey:@"type"] intValue];
NSString * query = [q objectForKey:@"query"];
}
//some code
}
在Java中,我试图做这样的事情:
// in some other method :
JSONObject jsonData= new JSONObject();
String authHash = jsonData.getJSONObject("client_auth_hash").toString();
List<Map<String,String>> injectQueries= new ArrayList<Map<String,String>>();
injectQueries.add(new HashMap<String, String>());
//injectQueries.add(authHash);
public boolean processSqlInjectQueries(List<Map<String,String>> injectQueries, Exception error){
if(injectQueries==null || injectQueries.size()==0){
boolean injectsProcessed = this.processSqlInjectQueries(injectQueries,error);
if(!injectsProcessed){
return false;
}
}
Log.i("Info","Processing INJECT Queries...");
boolean res = true;
/*[_dbAdapter beginTransaction];
[_user.userDbAdapter beginTransaction];*/
for(Map<String,String> b : injectQueries){
if(b.getClass().getName()!=injectQueries.getClass().getName()){
continue;
}
//RPCPacketInjectQueryPackage qType = (RPCPacketInjectQueryPackage)
}
return true;
}
但我的问题是我收到此错误:Type mismatch: cannot convert from element type Object to ArrayList
。
有任何建议如何修复该错误?
第二个问题:我可以在Exception error
中使用processSqlInjectQueries
代替Obj-C中的NSError *error
吗?
答案 0 :(得分:7)
迭代ArrayList
引发错误是因为您的代码需要声明b
是Object
(因为injectQueries
包含Object
类型的对象,而不是ArrayList
类型的对象1}}):
for(Object b : injectQueries){
...
}
由于Objective-C中的NSDictionary
类与Java中的Map
类非常相似,因此您可以通过将b
转换为Map
来模仿Objective-C代码,甚至更好,您可以使用泛型来指定injectQueries
包含Map
个对象。例如:
public boolean processSqlInjectQueries(List<Map<String,String> injectQueries, Exception error) {
// some code
for(Map<String,String> b : injectQueries) {
...
}
// some code
return true;
}
异常处理
关于第二个问题,Java中的方法通常会抛出Exception
个对象来传达错误条件,因此您的方法签名将类似于以下内容:
public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) throws Exception
请注意,最好特定于您的异常(即抛出属于Exception
的子类的对象),以便您的方法调用者知道出了什么问题。有关在Java中处理异常的其他指南,请参阅以下链接:
答案 1 :(得分:1)
目标C代码通过包含NSDictionaries的NSArray传递给方法,因此以下内容可能更接近您想要做的...
public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) {
for(Map<String,String> q : injectQueries) {
// do stuff with q
}
}
要处理错误代码,您可能想要考虑抛出异常而不是尝试传递“Error”对象,如下所示:
public boolean processSqlInjectQueries(List<Map<String,String> injectQueries) throws Exception {
for(Map<String,String> q : injectQueries) {
// do stuff with q
}
if(errorConditionOccurs) {
throw new Exception();
}
}
您需要定制抛出的确切异常,以便它匹配您尝试执行的任何代码。
回应评论:或许这更接近你想要做的事情?
public boolean processSqlInjectQueries(JSONObject jsonObject) {
for(String key : jsonObject.keys()) {
Object value = jsonOnject.get(key);
// Do stuff with value
}
// Do more stuff
}
你可以用:
来称呼它processSqlInjectQueries(jsonData.getJSONObject("client_auth_hash"));