2013-07-22 6 views
1

Я раньше не работал с Generics. Сейчас настало время, когда я должен создать общий класс, иначе длина моего кода станет больше и сложнее понять.Android: не удалось создать общий класс

Это как записи вставляются в базу данных, расположенной на Windows Azure:

public class Item { 
    public int Id; 
    public String Text; 
} 

В той же деятельности, где вы определили mClient, добавьте следующий код:

Item item = new Item(); 
item.Text = "Awesome item"; 
mClient.getTable(Item.class).insert(
     item, 
     new TableOperationCallback<Item>() { 
      public void onCompleted(
        Item entity, 
        Exception exception, 
        ServiceFilterResponse response 
      ) { 
       if (exception == null) { 
        // Insert succeeded 
       } else { 
        // Insert failed 
       } 
      } 
     }); 

Я не могу для создания универсального класса для выполнения операций с базой данных, таких как вставка, удаление, ..., расположенная в Windows Azure.

Это ссылка для справки Windows Azure (если требуется):

http://dl.windowsazure.com/androiddocs/

Я попытался следующий код:

public class WindowsAzureOperations<T> { 

    T mT; 
    MobileServiceClient mClient; 
    Context mContext; 

    public void insert(MobileServiceClient mClient, T tObject, final Context tmpContext) { 

     this.mClient = mClient; 
     mT = tObject; 
     mContext = tmpContext; 

     this.mClient.getTable(mT.getClass()).insert(mT, // error in this line 
       new TableOperationCallback<T>() { 

        public void onCompleted(T entity, Exception exception, 
          ServiceFilterResponse response) { 

         if (exception == null) { 

         } else { 

         } 
        } 
       }); 
    } 
} 

Он показывает следующее сообщение об ошибке:

The method insert(capture#1-of ? extends Object, TableOperationCallback<capture#1-of ? extends Object>) in the type MobileServiceTable<capture#1-of ? extends Object> is not applicable for the arguments (T, new TableOperationCallback<T>(){})

Пожалуйста, помогите мне. Заранее спасибо.

ответ

2

Проблема в том, как вы звоните getTable. Учитывая Class<T>, этот метод вернет MobileServiceTable<T>. Но mT.getClass() возвращает Class<? extends T>, так как тип времени работы mT может быть Tили какого-либо другого типаT.

В качестве обходного пути, ваш метод insert принимают параметр ровно типа Class<T>:

public void insert(
     MobileServiceClient mClient, 
     T tObject, 
     Class<T> objectType, 
     final Context tmpContext 
) { 

    this.mClient = mClient; 
    mT = tObject; 
    mContext = tmpContext; 

    this.mClient.getTable(objectType).insert(
      mT, 
      new TableOperationCallback<T>() { 

       public void onCompleted(T entity, Exception exception, 
         ServiceFilterResponse response) { 

        if (exception == null) { 

        } else { 

        } 
       } 
      }); 
} 

Я также рекомендую переместить назначение mClient, mT и mContext конструктору WindowsAzureOperations. Фактически, принимая ваш класс по номинальной стоимости, нет необходимости его создавать - просто используйте статический общий метод:

public final class WindowsAzureOperations { 

    // now a utility class so prevent instantiation 
    private WindowsAzureOperations() { } 

    public static <T> void insert(
      MobileServiceClient mClient, 
      T tObject, 
      Class<T> objectType, 
      final Context tmpContext 
    ) { 
     mClient.getTable(objectType).insert(
       tObject, 
       new TableOperationCallback<T>() { 
        @Override 
        public void onCompleted(
          T entity, 
          Exception exception, 
          ServiceFilterResponse response 
        ) { 
         if (exception == null) { 
          //... 
         } 
         else { 
          //... 
         } 
        } 
       } 
     ); 
    } 
} 
+0

Спасибо, сэр. Теперь он не показывает никакой ошибки. Я попробую запустить код и уведомить вас. PS: ваш опыт показывает, что это определенно помогает мне. Еще раз спасибо вам большое. –

+0

Несомненно, сэр. Спасибо. Это действительно помогло мне мыслить по-новому. –

+0

@ shree202 Без проблем, рад, что я мог бы помочь. –

Смежные вопросы