j'ai essayé de faire une fonction des données de générique pauvre homme persistance qui prendrait un MutableSet de classe de données et sérialisation sur disque. Je voudrais quelque chose de facile pour le prototypage, et j'appelle "save()" sur l'ensemble si souvent que si mon processus est tué, je peux plus tard reprendre avec un "load()" des entrées sauvegardées. Mais je ne comprends pas les différences entre '*', 'in', 'out' et 'Nothing' même après avoir relu la page Generics. Cela semble fonctionner sans jeter d'erreurs, mais je ne comprends pas pourquoi les deux étant "out", je pensais que l'on devrait être "in" ... ou plus probablement je comprends Kotlin Generics complètement faux. Y a-t-il une façon correcte de le faire?Kotlin « out » et « dans » et génériques - bon usage
/** Save/load any MutableSet<Serializable> */
fun MutableSet<out Serializable>.save(fileName:String="persist_${javaClass.simpleName}.ser") {
val tmpFile = File.createTempFile(fileName, ".tmp")
ObjectOutputStream(GZIPOutputStream(FileOutputStream(tmpFile))).use {
println("Persisting collection with ${this.size} entries.")
it.writeObject(this)
}
Files.move(Paths.get(tmpFile), Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING)
}
fun MutableSet<out Serializable>.load(fileName:String="persist_${javaClass.simpleName}.ser") {
if (File(fileName).canRead()) {
ObjectInputStream(GZIPInputStream(FileInputStream(fileName))).use {
val loaded = it.readObject() as Collection<Nothing>
println("Loading collection with ${loaded.size} entries.")
this.addAll(loaded)
}
}
}
data class MyWhatever(val sourceFile: String, val frame: Int) : Serializable
et être en mesure de lancer une application avec
val mySet = mutableSetOf<MyWhatever>()
mySet.load()
La deuxième option a bien fonctionné, et merci d'expliquer "Rien"! –