'Kotlin generic factories

I'm trying to create an AnimalFactory that returns generic factories for making different types of Animals, depending on the arguments passed to the AnimalFactory.

Here's the code:

interface Animal {
    fun talk(): String
}

class Cow: Animal {
    override fun talk(): String {
        return "mooo"
    }
}

class Cat: Animal {
    override fun talk(): String {
        return "miow"
    }
}

class Dog: Animal {
    override fun talk(): String {
        return "bark"
    }
}

object AnimalFactory {
    fun <T: Animal> AnimalMakerFactory(type: String): AnimalMaker<T> {
        val maker = when (type) {
            "cat" -> CatMaker()
            "dog" -> DogMaker()
            else -> CowMaker()
        }
        
        return maker
    }
}

interface AnimalMaker<out T: Animal> {
    fun make(): T
}

class CatMaker: AnimalMaker<Cat> {
    override fun make(): Cat {
        return Cat()
    }
}

class DogMaker: AnimalMaker<Dog> {
    override fun make(): Dog {
        return Dog()
    }
}

class CowMaker: AnimalMaker<Cow> {
    override fun make(): Cow {
        return Cow()
    }
}

I get a type exception:

Type mismatch.
Required: AnimalMaker<T>
Found: AnimalMaker<Animal>

I thought that AnimalMaker would solve this, but apparently not. Why is AnimalMaker<T> not of type AnimalMaker<Animal> here?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source