2017-02-17 3 views
1

У меня есть базовый абстрактный класс:Дженерики и абстрактный класс в Котлин

abstract class BaseFragment<T : BasePresenter> : Fragment(){ 

    protected var presenter : T? = null 

    abstract fun providePresenter() : T 

    abstract fun getLayoutId() : Int 

    abstract fun onCreate() 

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 
     val root = inflater?.inflate(getLayoutId(), container, false) 
     presenter = providePresenter() 
     return root 
    } 

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { 
     onCreate() 
    } 

} 

Мой код в Java:

//JAVA 

private ArrayList<BaseFragment> fragments; 

Как я могу использовать его Котлин? Код не пыльник работает

//Kotlin 

val tabs = ArrayList<BaseFragment>() //error: One type argument expected for class BaseFragment<T : BasePresenter> : Fragment 

ответ

2

Вам необходимо указать тип для T

val tabs = ArrayList<BaseFragment<SomePresenterType>>() 
+0

Thx. Он должен работать, но не в моей ситуации. Мне нужно: 'val tabs = ArrayList >() tabs.add (instanceOf ())' Возможно, я что-то не так в своей базовой архитектуре? – Skullper

+0

В kotlin вы просто используете '()' для создания экземпляров, поэтому 'tabs.add (ProfileFragment())' должен работать – lukle

+0

@PavliukR. Кстати, вы должны указать полный тип 'BaseFragment' в вашем Java-коде. Это типичный тип в примере, который вы дали. Он должен дать вам предупреждение о компиляторе. – marstran