2013-05-11 128 views
3

我有跟随着抽象类...Java泛型,不兼容类型的错误(与继承)

public abstract class IRepository<T> { 

    public T getEntityById(int idEntity){ 
    try{ 
     Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
     Transaction tx = session.beginTransaction(); 
     T result = (T) session.createQuery(getByIdQuery() + idEntity).uniqueResult(); 
     tx.commit(); 
     if (result != null){ 
      System.out.println("Fetched " + result.toString()); 
      return result; 
     } 
     else return null; 
    } 
    catch (Exception e){ 
     // TO DO : logging 
     handleException(e); 
     return null; 
    } 
} 

而另一个类,从这个继承...

public class ProductRepository extends IRepository<Product> { 

    public ProductRepository(){ 

    } 
} 

当我从做一个主类下面的调用,我发现了一个错误...

ProductRepository prodRep = new ProductRepository(); 
Product result = prodRep.getEntityById(111); 

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types 
required: gestor.model.Product 
found: java.lang.Object 

我的问题是。为什么会出现这种情况?是不是我的getEntityById返回类型T的东西,在这种情况下,应该是产品?

我在Netbeans工作,编译时没有显示错误。

感谢您的帮助=)

+1

会发生什么,如果你尝试'IRepository prodRep =新ProductRepository()'? – wchargin 2013-05-11 03:11:45

+0

你可以试一下'Object result = prodRep.getEntityById(111);的System.out.println(结果);产品产品=(产品)结果;'? – wchargin 2013-05-11 03:21:43

回答

3

我会怀疑您的导入或配置错误。在Eclipse中,您可以“清理”一个项目以清除所有二进制文件并重建;尝试Netbeans中的等效项。

下面的代码工作正常,对我来说,它似乎是你的问题的直接简化:

// Test.java 
public abstract class Test<T> { 
    public T get(int i) { 
    return null; 
    } 
    public static void main(String[] args) { 
    StringTest st = new StringTest(); 
    String s = st.get(0); 
    System.out.println(s); // prints: null 
    } 
} 
class StringTest extends Test<String> { 
    public StringTest() { } 
} 
+0

浪费了很多时间,看起来像一个非常简单的解决方案,一旦我知道它..感谢很多Chargin,像一个魅力工作.. – 2013-05-11 03:30:31

+0

什么结束了这个问题? – wchargin 2013-05-11 03:31:32

+0

你建议...必须做一个清洁和重建项目:) – 2013-05-11 03:34:54