当前位置: 首页 > 知识库问答 >
问题:

Java泛型,不兼容类型错误(带有继承)

昌博易
2023-03-14

我在抽象课上有以下内容...

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个答案

经国安
2023-03-14

我怀疑您的导入或配置中有错误。在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() { }
}
 类似资料:
  • 问题内容: 我在写一些代码,遇到编译错误。这就是我所拥有的: 我以为使用继承时没有正确声明泛型,所以我检查了Oracle的教程,他们在其中编写 上面的声明使用相同的泛型类型,这是我在示例中要完成的工作。似乎假设from 与from 有所不同。否则,它应该能够 将 两者 合并并看到相同的类型。如何正确实现我要实现的目标? ( 即,某物的常量是某物的值,这是同一物的表达 ) 问题答案: 您的变量定义为

  • 我定义jackoson序列化器并将其添加到java类中,如下所示: 编译器出现以下错误: 注释的定义为: 如果我从ReportFilterDeserializer中删除泛型attibute,它将通过编译。我不明白编辑为什么抱怨。

  • 问题内容: 我正在学习Java。我试图运行代码,但出现此错误:。它向我显示错误的代码部分。 为什么会这样呢? 问题答案: 这是因为在类中不能有两个具有相同名称但返回类型不同的方法。 子类不能使用与返回类型不同的超类中已经存在的方法相同的名称声明方法。 但是,子类可以声明具有与超类相同的签名的方法。我们称此为“覆盖”。 你需要这个 要么 一个好的做法是通过注释标记覆盖的方法:

  • 在处理一些旧代码时,我偶然发现了一个问题,用lambda表达式或方法引用替换了几个匿名类。这个问题有点难以用语言来解释,但我会尽我所能,下面我还添加了一个简短的例子,尽我所能来说明我的问题。 我的示例包括。。。 > 一个函数接口,GenericListener,它接受类型参数V并具有单个方法“GenericCallback(V GenericValue)”。 一个类,CallbackProduce

  • 我一直试图编译这个简单的警报对话框,以便在用户单击提交按钮时显示。编译代码时会弹出一条错误消息: 错误:(33,74)错误:不兼容的类型: 这个类叫做Login_Activity,它扩展了BaseActivity,它扩展了Activity。

  • 我是一名java初学者,我正在阅读“Java初学者指南”这本书和泛型的主题。作者创建了以下泛型类: 在这种情况下,类型参数必须是Number或Number的子类。 作者说,如果我们添加一个新方法来检查存储在两个通用对象中的数值绝对值,如下所示: 用它写的解释是: 这里,使用标准方法Math.abs()获取每个数字的绝对值,然后进行数值比较,这种尝试的麻烦在于,它只会对类型与调用对象相同的其他Num