2013-05-20 2 views
0

Я работаю над тестированием lib для Android.Return dynamic cast Деятельность

Что я хочу сделать, так это создать метод, который создает из него имя класса и возвращает экземпляр действия.

Например, я получаю имя класса для SampleActivity, и этот класс как действие расширяет класс андроида Activity. Тогда мне нужно вернуть экземпляр SampleActivity

Попытайтесь уловить для ясности.

Это то, что я сейчас на

public static Class<? extends Activity> createActivity(String activityName){ 

    Class<? extends Activity> clazz = null; 
    Class<? extends Activity> activity = null; 

    clazz = (Class<? extends Activity>) Class.forName(activityName); 
    activity = clazz.newInstance(); // incompatible type 

    return activity; 
} 
+0

Обычно операционная деятельность выполняется ОС. Для чего нужна ручная инстанция? –

+0

Тестирование с помощью Robolectric – Axxiss

+0

Вы хотите, чтобы возвращаемый тип как класс или объект класса i.e? –

ответ

0

Изменение переменной активности с типом активности, а не класса.

Вы также должны изменить метод декларации что-то вроде:

public <T extends Activity> T createActivity(String className) 

Если вы знаете только класс как String, это про лучшее, что можно сделать, и потребитель будет знать только возвращенный объект как активность , Его нужно будет отбросить, если он хочет более конкретного типа. Увидев, что у вас только есть имя класса в виде строки, как ваш код вызова даже знает тип, который нужно наложить в любом случае.

Теперь, если вы на самом деле имели тип класса во время компиляции можно определить метод, как это:

public <T extends Activity> createActivity(Class<T> clazz){ 
    return clazz.newInstance(); 
} 

Но я был под впечатлением, что у вас нет конкретного класса во время компиляции.

+0

Возвращаемый тип метода createActivity также должен быть изменен –

+0

Если я вернусь к типу 'Activity', мне придется выдать его снаружи, и это не вариант (если нет другого пути). Я хочу вернуть определенную активность, то есть 'SampleActivity', где, очевидно,' SampleActivity' расширяет 'Activity'. – Axxiss

0

Я думаю, что если я понять правильно, это то, что вам нужно сделать:

public static Activity createActivity(String activityName) 
{ 
    Class<? extends Activity> c = (Class<? extends Activity>) Class.forName(activityName); 
    Activity activity = c.newInstance(); 
    return activity; 
} 

Вы можете использовать этот класс следующим образом:

SampleActivity sampleActivity = (SampleActivity) createActivity("com.abc.SampleActivity"); 

ИЛИ

Если вы хочу вернуть Class, а затем использовать

public static Class<? extends Activity> createActivity(String activityName) 
{ 
    Class<? extends Activity> clazz = null; 
    Class<? extends Activity> activity = null; 

    clazz = (Class<? extends Activity>) Class.forName(activityName); 
    activity = clazz.newInstance(); 
    return activity.class; 
} 

Убедитесь, что activityName является полного имени класса, а также класс представлен activityName должна быть подклассом Activity.

+0

Я хочу вернуть экземпляр SampleActivity. SampleActivity расширяет активность. – Axxiss

+0

Тогда первый подход правильный –

+0

Вопросы обновлены, проверьте его для получения более подробной информации. – Axxiss

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