Java generics: Как переносить / продлевать тестовую версию Android Activity?

Я пытаюсь расширить ActivityInstrumentationTestCase2 следующим образом:

public abstract class FooActivityTestCase<T extends Activity> extends ActivityInstrumentationTestCase2<Activity> { public FooActivityTestCase(String pckg, Class<Activity> activityClass) { super(pckg, activityClass); } public void foo(){ ... } } 

Я пытаюсь расширить FooActivityTestCase следующим образом:

 public class SpecificFooTestCase extends FooActivityTestCase<MyActivity> { public SpecificFooTestCase() { super("foo.bar", MyActivity.class); // error on this line } } 

Eclipse дает мне следующую ошибку в конструкторе:

 The constructor FooActivityTestCase<MyActivity>(String, Class<MyActivity>) is undefined 

Я уверен, что проблема связана с тем, как я использую дженерики. Когда SpecificFooTestCase расширяет ActivityInstrumentationTestCase2 я не получаю никаких ошибок. Может ли кто-нибудь указать, что я делаю неправильно?


Предложения Кубилай-хана и Майкла Майерса работают вместе. После того, как я сменил FooActivityTestCase для расширения ActivityInstrumentationTestCase2<T> и Class<Activity> до Class<T> в конструкторе, классы компилируются без ошибок. Это результирующий класс (SpecificFooTestCase не изменился):

 public abstract class FooActivityTestCase<T extends Activity> extends ActivityInstrumentationTestCase2<T> { public FooActivityTestCase(String pckg, Class<T> activityClass) { super(pckg, activityClass); } public void foo(){ ... } } 

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

 //Only accepts classes that are Activity or extend Activity public FooActivityTestCase(String pckg, Class<? extends Activity> activityClass) { super(pckg, activityClass); } 

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

Вот как я делаю тестирование устройств Android:

 public class MyInstrumentationTestRunner extends InstrumentationTestRunner { @Override public TestSuite getAllTests() { InstrumentationTestSuite suite = new InstrumentationTestSuite(this); suite.addTestSuite(MyTestClass.class); return suite; } @Override public ClassLoader getLoader() { return MyInstrumentationTestRunner.class.getClassLoader(); } } 

И определите свои тестовые классы как таковые:

 public class myTestClass extends ActivityInstrumentationTestCase2<Home> { Context _context; public MyTestClass() { super("com.MyClassToTest", Home.class); } public void testfunction() { myFunction(_context); } @Override protected void setUp() throws Exception { super.setUp(); setActivityInitialTouchMode(false); Activity activity = getActivity(); _context = activity.getApplicationContext(); } }