2015-02-09 168 views
2

我对Scala非常陌生,我试图将一些JSF控制器转换为Scala来做一些测试。 代码如下:在编译时Scala类型与泛型不匹配

abstract class BaseListBean[TENTITY <: AnyRef, TID <: AnyRef] extends Serializable { 

    @BeanProperty var current:TENTITY = _ 

    @BeanProperty var lazyDataModel: LazyDataModel[TENTITY] = _ 

    def initLazyDataModel(): LazyDataModel[TENTITY] = { 

    val model:LazyDataModel[TENTITY] = new LazyDataModel[TENTITY]() { 

     override def load(first: Int, pageSize: Int, sortField: String, sortOrder: SortOrder, filters: util.Map[String, AnyRef]): util.List[TENTITY] = { 

     val paginationInfo:PaginationInfo = new PaginationInfo() 
     paginationInfo.setFromRecord(first) 
     paginationInfo.setPageSize(pageSize) 
     paginationInfo.setSortBy(Array(sortField)) 
     paginationInfo.setDirections(if (SortOrder.ASCENDING == sortOrder) Array(Direction.Asc) else Array(Direction.Desc)) 

     val advisoryPaginatedResult:PaginatedResult[TENTITY] = getBaseCRUD.read(paginationInfo) 
     setRowCount(advisoryPaginatedResult.getTotalItems.toInt) 

     advisoryPaginatedResult getItems 
     } 

     override def getRowKey(obj: TENTITY): TID = getEntityKey(obj) 

    } 

    return model; 

    } 



    def init() = { 
    setLazyDataModel(initLazyDataModel()) 

    } 

    def getEntityKey(obj: TENTITY) : TID 
    def getBaseCRUD() : BaseCRUD[TENTITY, TID] 
    def customInit() = { 

    } 

} 

的错误是:

Error:(24, 34) type mismatch;

found : org.primefaces.model.org.primefaces.model.LazyDataModel[TENTITY]

required: org.primefaces.model.org.primefaces.model.LazyDataModel[TENTITY]

val model:LazyDataModel[TENTITY] = new LazyDataModel[TENTITY]() { 

我寻找一个解决方案,但问题仍然remaign。我尝试用更简单的代码重现像这样:

abstract class ExampleGenerics[T <: AnyRef, V <: AnyRef] { 

    @BeanProperty var list:util.AbstractMap[T, V] = _ 

    def initList() : util.AbstractMap[T, V] = { 
    val model:util.AbstractMap[T, V] = new util.AbstractMap[T, V]() { 
     override def entrySet(): util.Set[Entry[T, V]] = { 
     return null; 
     } 
    } 
    return model 
    } 

    def init() = { 
    setList(initList()); 
    } 

} 

但是,这将工作。有人可以帮忙吗?由于

回答

0

我发现这个问题:

这是LazyDataModel<T>头:

public abstract class LazyDataModel<T> extends DataModel<T> implements SelectableDataModel<T>, Serializable { /*...*/ } 

类继承DataModel<T>

在我的pom.xml我有

<dependency> 
     <groupId>javax.faces</groupId> 
     <artifactId>javax.faces-api</artifactId> 
     <version>2.0</version> 
     <scope>provided</scope> 
    </dependency> 

<dependency> 
    <groupId>javaee</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>5</version> 
    <scope>provided</scope> 
</dependency> 

DataModel<T>是在JSF 2包,而且在JavaEE的-API有DataModel类(不通用) 。所以编译器出错了。 决议符合以下依存修改POM:

<dependency> 
    <groupId>javax.ejb</groupId> 
    <artifactId>ejb-api</artifactId> 
    <version>3.0</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>servlet-api</artifactId> 
    <version>2.5</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>javax.faces</groupId> 
    <artifactId>javax.faces-api</artifactId> 
    <version>2.0</version> 
    <scope>provided</scope> 
</dependency> 

因为我使用JEE5兼容应用服务器与JSF2.0升级我不能使用JEE6 API的依赖。