2015-06-10 3 views
1
import org.json.*; 
import org.json.JSONObject; 

import java.util.Iterator; 

/** 
* Created by nubuntu on 10/06/2015. 
*/ 
public class Object { 
    private Callback callback; 
    static void each(JSONObject json,Callback callback){ 
     Iterator<?> keys = json.keys(); 
     while(keys.hasNext()) { 
      String key = (String)keys.next(); 
      try { 
       callback.run(key,json.get(key)); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    static void each(JSONArray json,Callback callback){ 
     for(int i=0;i<json.length();i++){ 
      JSONObject obj = null; 
      try { 
       obj = json.getJSONObject(i); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      callback.run(obj); 
     } 
    } 
    public interface Callback{ 
     public void run(String key, java.lang.Object o); 
    } 
    // Error : Duplicate Class 
    public interface Callback{ 
     public void run(java.lang.Object o); 
    } 

} 

Я хочу реализовать «каждый», как JQuery для JSONObject & JSONArray, может быть много другого объекта позже, пример использования:Java Dynamic Type How To?

 JSONObject jsonobject= new JSONObject("hair":"black","eye":"blue"); 
     Object.each(jsonobject,new Object.Callback() { 
      @Override 
      public void run(String key, Object o) { 
       Log.d(key,o.toString()); 
      } 
     }); 

, но когда я хочу создать второй обратный вызов, он не может дублировать как выше статического каждого метода, так как обращаться с каждым для динамического типа?

ответ

0

В случае андроида, я думаю, что ваш код будет работать, если вы измените, как показано ниже:

public interface Callback{ 
    public void run(String key, java.lang.Object o); 
    public void run(java.lang.Object o); 
} 

вашей each функции есть ошибка из-за ваш Callback интерфейса не потому, что сам по себе.

0

Это разные имена для разных интерфейсов.

public interface CallbackKeyValue { 
    public void run(String key, java.lang.Object o); 
} 

public interface CallbackValue { 
    public void run(java.lang.Object o); 
} 

Lambda выражение в JAVA8 не требует имен интерфейса.

Object.each(jsonobject, (key, o) -> 
    Log.d(key, o.toString()) 
); 
+0

спасибо, можете ли вы предложить мне ссылку, чтобы узнать выражение Lamda? –

+0

См. [Лямбда-выражения] (https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html). Есть стандартные интерфейсы, которые вы привыкли. 'BiConsumer ' и 'Consumer ' – saka1029

0

ничего себе, как я могу пропустить это просто решение, благодаря @Kingfisher

, но теперь, как избежать другой бесполезный метод «запустить», обратного вызова нужно просто один метод запуска для выполнения

 JSONObject jsonobject= new JSONObject("{'hair':'black','eye':'blue'}"); 
     Object.each(jsonobject, new Object.Callback() { 
      @Override 
      public void run(String key, java.lang.Object o) { 
       // Code run here.... 
      } 

      @Override 
      public void run(java.lang.Object o) { 
       // useless 
      } 
     });