(Xem thêm hai câu hỏi liên quan: Scala fails to infer the right type arguments và Type infered to Nothing in Scala)
Nó trông giống như một giới hạn của suy luận kiểu Scala, mà là cố ý không spec'ed. Như công việc xung quanh, bạn có thể nhận được kết luận bằng cách làm cho T
một loại viên của B
chứ không phải là tham số,
abstract class A
abstract class B { type T <: A }
class ConcreteA extends A
class ConcreteB extends B { type T = ConcreteA }
class Example[U <: B](resolver: U)
object Test {
new Example(new ConcreteB)
}
Khi sử dụng các thành viên loại, nó là hữu ích để biết rằng họ có thể nổi lên như các tham số kiểu sử dụng tinh tế, như trong câu trả lời của Miles Sabin cho: Why is this cyclic reference with a type projection illegal?
Trong câu trả lời của Jean-Philippe Pellet với a related question, suy luận kiểu được hỗ trợ bằng cách làm cho thông số loại cao hơn. Nếu bạn giới thiệu một số loại phụ trong ConcreteB
, sau đó gõ suy luận có thể làm việc,
abstract class A
abstract class B[T <: A]
class ConcreteA extends A
class ConcreteB[T <: A] extends B[T]
class Example[T <: A, U[T0 <: A] <: B[T0]](resolver: U[T])
object Test {
new Example(new ConcreteB[ConcreteA])
}
Scala 2.9 đưa ra thông điệp lỗi bí ẩn bên dưới, nhưng Miles Sabin chỉ ra nó là một lỗi sẽ được cố định cho 2,9. 1
<console>:15: error: kinds of the type arguments (ConcreteA,ConcreteB[T0]) do not conform to the expected kinds of the type parameters (type T,type U) in class Example.
ConcreteB[T0]'s type parameters do not match type U's expected parameters: class ConcreteB has one type parameter, but type U has one
new Example(new ConcreteB[ConcreteA])
^
Nguồn
2011-07-31 23:35:49
bản sao có thể có của [Loại infered to Nothing in Scala] (http://stackoverflow.com/questions/6888136/type-infered-to-nothing-in-scala) –
Nó tương tự, nhưng câu trả lời được chấp nhận cho rằng câu hỏi không áp dụng trong trường hợp này. –