TRY ANDROID DEV

Android アプリ開発のコーディングネタ。あとエンジニアとしての活動

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のライブラリこういうの多いのでつらい