2017-01-17 7 views
1

Предположим, у нас есть абстрактный метод, который должен возвращать Class:Как заставить пользователя отправить класс, который наследуется от базового класса?

abstract class MainClass{ 
    abstract Class onCreateClass(); 
} 

я реализовал класс как это:

class ChildClass extends MainClass{ 
    @Override 
    Class onCreateClass() { 
     return AnotherClass.class; 
    } 
} 
class AnotherClass { 

} 

Это работает хорошо, но теперь я хочу объявить некоторые ограничения на AnotherClass. Например, я хочу, чтобы заставить пользователя о MainClass для реализации onCreateClass таких, как он возвращает только классы, которые наследуют от BaseClass:

abstract class MainClass{ 
    abstract Class<BaseClass> onCreateClass(); 
} 

Но это не компилирует это:

class ChildClass extends MainClass{ 
    @Override 
    Class onCreateClass() { 
     return AnotherClass.class; 
    } 
} 
class AnotherClass extends BaseClass { 

} 

ответ

3

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

abstract class MainClass{ 
    abstract Class<? extends BaseClass> onCreateClass(); <-- all classes extends BaseClass 
} 

class ChildClass extends MainClass{ 
    @Override 
    Class<AnotherClass> onCreateClass() { <-- compilation valid 
     return AnotherClass.class; 
    } 
} 


class AnotherClass extends BaseClass { 

} 

private class BaseClass { 
} 


class SecondChildClass extends MainClass{ 
    @Override 
    Class<SecondAnotherClass> onCreateClass() { <-- compilation failed 
     return SecondAnotherClass.class; 
    } 
} 

private class SecondAnotherClass { 
} 
3

Вы идете на :

abstract class MainClass <T extends BaseClass> { 
    abstract Class<T> onCreateClass(); 
} 

И теперь вы можете либо пойти

class ChildClass extends MainClass<SomeSpecificClassExtendingBase> { 
    class<SomeSpecificClassExtendingBase> onCreateClass() { 
    return AnotherClass.class; 
    } 

или

class ChildClass<T extends BaseClass> extends MainClass<T> { 

Другими словами: вы можете выразить определенные ограничения на общих типов, и это один из самых простых примеров о том, как сделать это. Возможно, вы хотите продолжить чтение here или (хардкор) here.

+1

является класс ' MainClass' допустимый синтаксис для Java? –

+0

@ VladBochenin У меня еще не было утреннего кофе. Ты прав. Исправлена! Благодаря! – GhostCat

+0

Приятно видеть даже 27k + Пользователи могут ошибаться; P – Fildor