Say mam:Dlaczego ta składnia parametru typu nie jest kompilowana?
class Class[CC[A, B]]
class Thing[A, B <: Int]
class Test extends Class[Thing] // compile error here
pojawia się błąd kompilatora:
kinds of the type arguments (cspsolver.Thing) do not conform to the expected kinds of the type parameters (type CC) in class Class. cspsolver.
Thing's type parameters do not match type CC's expected parameters: type C's bounds <: Int are stricter than type B's declared bounds >: Nothing <: Any
Jednak kiedy zmodyfikować kod tak, że wygląda to tak:
class Class[CC[A, B]]
class Thing[A, B] {
type B <: Int
}
class Test extends Class[Thing]
kompiluje grzywny. Czy nie są one funkcjonalnie równoważne?
W ostatnim przykładzie masz typ parametru 'B' i typ członka' B'. Mają takie samo imię (tak, że tylko jeden jest widoczny), bot nie są takie same. – senia
@senia, czy istnieje przypadek, gdy użycie tej samej nazwy jest przydatne? – huynhjl
@huynhjl: Chyba nie. Ale w niektórych przypadkach shadowing jest użyteczny: możesz ponownie użyć nazwy. W przypadku implikacji istnieją również częściowe, przydatne nadużywanie shadowingu: patrz [ta odpowiedź] (http://stackoverflow.com/a/17852226/406435). – senia