2015-08-19 13 views
7

Tôi đang cố gắng sửa đổi một đặc điểm mà tôi có được sử dụng cho truy vấn cơ sở dữ liệu Scala Slick. Dưới đây là hai phương pháp mà tôi có cho đến thời điểm này:Loại phụ cho phần tử bảng trong truy vấn Scala Slick

protected def findByPrimaryKey(id: PrimaryKeyType): Query[Table[_], T, Seq] 

/** 
* return the row that corresponds with this record 
* @param t - the row to find 
* @return query - the sql query to find this record 
*/ 

protected def find(t: T): Query[Table[_], T, Seq] 

Tôi muốn sửa đổi hai chữ ký phương thức này để cho phép các kiểu con của T. Một ví dụ của điều này là nếu tôi có một định nghĩa về đặc điểm cho một bản ghi, nhưng cần thực hiện cụ thể đặc điểm đó để thực sự sử dụng cho slick. Tôi đã cố gắng làm một cái gì đó như thế này:

/** 
* return all rows that have a certain primary key 
* @param id 
* @return Query object corresponding to the selected rows 
*/ 
protected def findByPrimaryKey(id: PrimaryKeyType): Query[Table[_], _ <: T, Seq] 

/** 
* return the row that corresponds with this record 
* @param t - the row to find 
* @return query - the sql query to find this record 
*/ 

protected def find(t: T): Query[Table[_], _ <: T, Seq] 

Tuy nhiên tôi nhận được một lỗi biên dịch như sau:

[error] found : slick.driver.PostgresDriver.simple.Query[slick.driver.PostgresDriver.simple.Table[_],_$8,Seq] where type _$8 <: T 
[error]  (which expands to) scala.slick.lifted.Query[slick.driver.PostgresDriver.Table[_],_$8,Seq] 
[error] required: slick.driver.PostgresDriver.simple.Query[slick.driver.PostgresDriver.simple.Table[_],T,Seq] 
[error]  (which expands to) scala.slick.lifted.Query[slick.driver.PostgresDriver.Table[_],T,Seq] 
[error] Note: _$8 <: T, but class Query is invariant in type U. 
[error] You may wish to investigate a wildcard type such as `_ <: T`. (SLS 3.2.10) 
[error]   val query: Query[Table[_], T, Seq] = find(t) 
[error]            ^
[error] /home/chris/dev/suredbits-core/src/main/scala/com/suredbits/core/db/CRUDActor.scala:58: type mismatch; 
[error] found : slick.driver.PostgresDriver.simple.Query[slick.driver.PostgresDriver.simple.Table[_],_$8,Seq] where type _$8 <: T 
[error]  (which expands to) scala.slick.lifted.Query[slick.driver.PostgresDriver.Table[_],_$8,Seq] 
[error] required: slick.driver.PostgresDriver.simple.Query[slick.driver.PostgresDriver.simple.Table[_],T,Seq] 
[error]  (which expands to) scala.slick.lifted.Query[slick.driver.PostgresDriver.Table[_],T,Seq] 
[error] Note: _$8 <: T, but class Query is invariant in type U. 
[error] You may wish to investigate a wildcard type such as `_ <: T`. (SLS 3.2.10) 
[error]   val query: Query[Table[_], T, Seq] = find(t) 
[error]            ^

và tôi không chắc về những gì phải làm để có được kết quả mà tôi muốn.

Trả lời

4

Lý tưởng nhất, bạn nên thực hiện Query biến với T. Nhưng vì đó là ngoài tầm kiểm soát của bạn, bạn có thể làm điều đó như thế này (nó nên làm việc):

protected def find[U <: T](t: U): Query[Table[_], U, Seq] 

Nhưng tôi cảm nhận được bạn đang đối phó với một vấn đề lớn hơn ở đây. Tại sao bạn cần trừu tượng như vậy? Thiết kế lớp học của bạn là gì?

Các vấn đề liên quan