как заставить метод выводить универсальный тип - PullRequest
0 голосов
/ 08 июля 2019

в приведенном ниже коде, у меня есть 2 фрагмента FragmentLeft и FragmentRight, оба расширяются от класса Fragment. в соответствии с методами расширения, приведенными ниже, я пытаюсь использовать универсальный тип данных в качестве параметра метода, чтобы при использовании этого метода он принимал экземпляры FragmentLeft или FragmentRight .....

однако приведенный ниже код генерирует ошибку, указанную в комментарии

пожалуйста, дайте мне знать, как ее решить

код

var fragTransactionInstance = getFragmentManagerInstance()?.let {
        it.getFragmentTransactionInstance()
            ?.replaceTransaction(R.id.fragLeft, fragmentLeft)//no enough 
   information to infer type variable T   
            ?.replaceTransaction(R.id.fragRight, fragmentRight)////no 
   enough information to infer type variable T 
    }?.also {
        it.commit()
    }
  }

fun initViews() : Unit {
    fragmentLeft = FragmentLeft()
    fragmentRight = FragmentRight()
}
fun <T : Fragment> FragmentTransaction.replaceTransaction(layout: Int, t: 
Fragment?): FragmentTransaction {
    return this.replace(layout, t)
}

классы

import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.example.kotlindynmaicfragment_v1.MainActivity
import com.example.kotlindynmaicfragment_v1.R
import kotlinx.android.synthetic.main.activity_main.view.*

class FragmentRight : Fragment() {

val LOG_TAG = this::class.java.name

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d(LOG_TAG, "onCreate")

}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    Log.d(LOG_TAG, "onActivityCreated")

}

///////////////////
class FragmentLeft : Fragment() {

val LOG_TAG = this::class.java.name

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d(LOG_TAG, "onCreate")

}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    Log.d(LOG_TAG, "onActivityCreated")

}

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Я думаю, что проблема в том, что вы определили свой метод replaceTransaction как универсальный, но в этом методе вы вообще не используете T, поэтому вывод типа не знает, какой тип использовать на месте T.

Чтобы дать вам более простой пример, это вызовет ту же ошибку:

fun <T> foo() {
    println("Hello, world!")
}

fun main() {
    foo()
}

Это происходит потому, что T не может быть выведен, поэтому вам нужно явно указать, какой тип использовать (даже если он не используется вообще в foo):

fun main() {
    foo<Unit>() // I used Unit, but any other type would do
}

Учитывая это, вам вообще нужен T в вашем коде? И FragmentRight, и FragmentLeft простираются от Fragment, поэтому, если вам не нужно использовать определенные функции этих классов, вы можете отказаться от T и использовать родительский тип Fragment (как вы уже делаете).

0 голосов
/ 08 июля 2019

Вместо использования t:Fragment измените тип t на T, а не Fragment Попробуйте написать свою функцию расширения следующим образом:

fun <T : Fragment> FragmentTransaction.replaceTransaction(layout: Int, t: 
T): FragmentTransaction {
    return this.replace(layout, t)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...