My BaseFragment:
abstract class BaseFragment<ViewModel : BaseViewModel, Binding : ViewBinding> : Fragment() {
    protected abstract val viewModel: ViewModel
    private var _binding: Binding? = null
    protected val binding get() = _binding!!
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        _binding = Binding.inflate(inflater, container, false) //This line not working
        return binding.root
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initialize()
        setupListeners()
        observe()
    }
    abstract fun initialize()
    abstract fun setupListeners()
    abstract fun observe()
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}
But this line does not work _binding = Binding.inflate(inflater, container, false)
There is a working code but as for me this is shit coding:
abstract class BaseFragment<ViewModel : BaseViewModel, T : ViewBinding>() : Fragment() {
    private var _binding:T? = null
    protected abstract val viewModel: ViewModel
    protected val binding get() = _binding!!
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        val superclass: Type = javaClass.genericSuperclass!!
        val aClass = (superclass as ParameterizedType).actualTypeArguments[1] as Class<*>
        try {
            val method: Method = aClass.getDeclaredMethod(
                "inflate",
                LayoutInflater::class.java,
                ViewGroup::class.java,
                Boolean::class.javaPrimitiveType
            )
            _binding = method.invoke(null, layoutInflater, container, false) as T
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return binding.root
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initialize()
        setupListeners()
        observe()
    }
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
    abstract fun initialize()
    abstract fun setupListeners()
    abstract fun observe()
}
How to do it right anybody has a clean solution. I know the DataBinding has DataBindingUtil but i need for ViewBinding. Is there something similar for ViewBinding
I hope for your answers
.
EDIT
Library: https://github.com/kirich1409/ViewBindingPropertyDelegate
BaseFragment:
abstract class BaseFragment<ViewModel : BaseViewModel, Binding : ViewBinding>(
    layoutID: Int
) : Fragment(layoutID) {
    protected abstract val viewModel: ViewModel
    protected abstract val binding: Binding
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setupViews()
        setupListeners()
        setupObservers()
    }
    abstract fun setupViews()
    abstract fun setupListeners()
    abstract fun setupObservers()
}
class Fragment : BaseFragment<BaseViewModel, FragmentBinding>(
    R.layout.fragment
) {
    override val viewModel: BaseViewModel by viewModels()
    override val binding: FragmentBinding by viewBinding() // this is from library
    override fun setupViews() {
      
    }
    override fun setupListeners() {
    }
    override fun setupObservers() {
        
    }
}
 
     
     
     
     
    