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

泛型类中的方法未返回指定的类型。为什么?

沈凡
2023-03-14

下面对getHighest()和getLowest()的调用返回Comparable类型的对象,而不是T类型的对象,这正是我们想要的。为什么,我该如何改进这段代码,使这些调用返回T(这样T的字段和方法就可用了)?

public class HighestLowest<T extends Comparable<T> >  {
  
  private T lowest;
  private T highest;
  
  public static void main(String[] args) {

    HighestLowest city;
    HighestLowest employee;
    
    City[] cities = new City[3];
    Employee[] employees = new Employee[3];

    city = new HighestLowest<City>(cities);
    employee = new HighestLowest<Employee>(employees);

下一行生成编译器错误:

错误:找不到符号符号:方法getName()位置:接口java.lang.Comparable

我想employee.getHighest()返回一个员工(而不仅仅是一个比较),同时仍然使用泛型类/方法机制,但是怎么做呢?

    System.out.println("The oldest employee is: " +
                       employee.getHighest());

  }
  
  public T getLowest() {
    return lowest;
  }
  
  public T getHighest() {
    return highest;
  }
  
  public HighestLowest(T[] of) {
    lowest = lowest(of);
    highest = highest(of);
  }
  
  private T lowest(T[] of) {
    
    T lowest = of[0];
    
    for (T element : of) {
      if (element.compareTo(lowest) < 0) {
        lowest = element;
      }
    }
    
    return lowest;
    
  }
  
  private T highest(T[] of) {
    
    T highest = of[0];
    
    for(T element : of) {
      if (element.compareTo(highest) > 0) {
        highest = element;
      }
    }
    
    return highest;
    
  }
  
}

  class Employee implements Comparable<Employee> {
    // ...
  }
  
  class City implements Comparable<City> {
    // ...
  }

共有1个答案

钱凌
2023-03-14

您的< code>employee变量被声明为原始类型< code>HighestLowest。然后,编译器只知道它的< code>Comparable界限。编译器不知道您在运行时分配了泛型类型。

解决方案:将其声明为泛型类型< code > HighestLowest

 类似资料:
  • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的

  • 我正在实现我自己的泛型链表类,它有一个名为的实例方法,该方法生成链表的数组副本并返回它。然而,每当我试图在实例上调用该方法时,我总是得到错误消息“sllist.this cannot be referenced from a static context”。我搜索了一下,有些人说这是因为我没有在实例上调用那个方法,但我确实调用了。 下面是类: 它有一些方法,如,它们都没有问题。 是我不断收到错误消

  • Java中是否有一种方法可以通过一个方法的声明返回不同的类型? 我希望此方法返回一个对象,并在函数调用时将其转换为正确的类型。这就是我的想法,但它不是这样工作的。我是否需要某种通用返回类型来执行此操作?解决这个问题的最佳方法是什么?

  • 问题内容: 为什么以下代码会编译?该方法返回该类型或其子类的实例。类中的代码调用该方法。编译器允许将返回值存储到类型的变量(显然不在的层次结构中)。 即使在擦除类型之后, 返回类型也不应该仍然是的实例 吗? 该方法的字节码为: 编辑:一致地替换为。 问题答案: 这实际上是合法的类型推断*。 我们可以将其简化为以下示例(Ideone): 因为是接口,所以允许编译器推断(无意义的,实际上是)交集类型。

  • 我正在实现我自己的通用链表类,它有一个名为的实例方法,它可以制作链表的数组副本并返回它。但是,每当我尝试在实例上调用该方法时,我都会收到错误消息“SLList.this不能从静态上下文中引用”。我搜索了一下,有些人说这是因为我没有在实例上调用该方法,但我确实调用了。 下面是该类: 它有一些方法,比如<code>addLast、addFirst</code>它们没有问题。 是我不断收到错误消息的行,

  • 我想让一个函数返回一个保证实现两个接口的对象。编译时不一定知道确切的对象。我的代码看起来像: 在尝试编译时,我遇到以下错误: 你好世界java:13:错误:不兼容的类型:C无法转换为T 返回新的C() ^ 其中T是一个类型变量: T扩展了方法f(布尔值) HelloWorld中声明的a,B。java:14:错误:不兼容的类型:D无法转换为T 返回新的D() ^ 其中T是一个类型变量: T扩展了方法