Ce que je veux dire est ceci:Pourquoi les limites des paramètres de type sont-elles ignorées lors de l'utilisation de types existentiels dans Scala?
scala> class Bounded[T <: String](val t: T)
defined class Bounded
scala> val b: Bounded[_] = new Bounded("some string")
b: Bounded[_] = [email protected]
scala> b.t
res0: Any = some string
Pourquoi res0 sont de type ANY et non chaîne? Il pourrait bien savoir que b.t est au moins une chaîne. L'écriture
val b: Bounded[_ <: String] = new Bounded("some string")
fonctionne, mais elle est redondante par rapport à la déclaration de la classe elle-même.
Pourquoi pas simplement 'val b = new Bounded (" une chaîne de caractères ")'? b est déduit comme Bounded [String]. – IttayD
N'est-ce pas exactement comme demander pourquoi 'val o: Any =" une chaîne "' a le type de Any au lieu de String? – IttayD
@IttayD Oui, vous pouvez omettre l'annotation de type. Mon problème réel était dans un argument de méthode, où vous ne pouvez pas l'omettre. En outre, je ne suis pas d'accord avec votre deuxième commentaire: quand j'écris 'b.t', je récupère un objet de type T <: String, donc au moins un String, comme le garantit la définition de Bounded. Par conséquent, j'espérais que res0 aurait du type String et pas n'importe lequel, sans utiliser une annotation de type comme dans votre exemple. –