Type parameter bound for T in XXX is not satisfied が発生した場合の対処方法
背景
- 新規プロジェクトでViewModelの動きを試そうとしたら「Type parameter bound for T in XXX is not satisfied」が発生した
ソースコード
MainActivity.kt
import android.os.Bundle import androidx.fragment.app.FragmentActivity import androidx.lifecycle.ViewModelProviders class MainActivity : FragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val viewModel = ViewModelProviders.of(this@MainActivity).get(MainViewModel::class.java) // <-- Type parameter bound for T in XXX is not satisfied } }
MainViewModel.kt
import android.arch.lifecycle.ViewModel import com.jakewharton.rxrelay2.BehaviorRelay class MainViewModel : ViewModel() { public val relay = BehaviorRelay.create<String>() fun getStringData() { relay.accept("test") } }
内容
Type parameter bound for T in XXX is not satisfiedは「Tにバインドされているクラスの型が満たされていないよ」という意味。
つまりViewModelProviders.of().get()に渡している型が満たされていないらしい。いやクラス設定してるじゃん。。と思ったら、Activity側はandroidxを利用していて、ViewModelはandroid.archを利用していた。それは一致しない。。
以下のように修正したら直った。
MainViewModel.kt
import androidx.lifecycle.ViewModel // <-- fix. import com.jakewharton.rxrelay2.BehaviorRelay class MainViewModel : ViewModel() { public val relay = BehaviorRelay.create<String>() fun getStringData() { relay.accept("test") } }
まとめ
androidのライブラリこういうの多いのでつらい