处理 Java 泛型错误

发布于 2024-12-13 10:52:41 字数 668 浏览 1 评论 0原文

我在以下代码中有一些泛型:

public <T extends Comparable<T>> int insertionSort(T[] a) {
   // throw new RuntimeException("not implemented");
      final int L = a.length;
      int compares = 0;
      
      for(int i = 1; i < L; i++){
          for(int j = i; j > 0 && a[j].compareTo(a[j - 1]) < 0; j--){
              
              Comparable tmp = a[j];   // PROBLEM HERE
              a[j] = a[j - 1];
              a[j - 1] = tmp;       // PROBLEM HERE
              
              compares++;
          }
      }
      
    return compares;
  }

// PROBLEM HERE - 代码中的这两行有错误。

错误是我无法完成作业。

I have some generics in the following code:

public <T extends Comparable<T>> int insertionSort(T[] a) {
   // throw new RuntimeException("not implemented");
      final int L = a.length;
      int compares = 0;
      
      for(int i = 1; i < L; i++){
          for(int j = i; j > 0 && a[j].compareTo(a[j - 1]) < 0; j--){
              
              Comparable tmp = a[j];   // PROBLEM HERE
              a[j] = a[j - 1];
              a[j - 1] = tmp;       // PROBLEM HERE
              
              compares++;
          }
      }
      
    return compares;
  }

// PROBLEM HERE - those two lines in the code have a fault.

The errors are I can't make the assignments.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

乖乖公主 2024-12-20 10:52:41

a[j]T,而不是 Comparable

您只能将其放入 T 类型的变量中。

a[j] is a T, not a Comparable.

You can only put it into a variable of type T.

最偏执的依靠 2024-12-20 10:52:41

您的问题是 Comparable 是一个接口,而不是一个类。您需要创建一个实现Comparable的类的对象。

如果 T 实现 Comparable,那么您可以将 tmp 声明为 T 并使用它:

 T tmp = a[j];
 a[j] = a[j - 1];
 a[j - 1] = tmp;

Your problem is that Comparable is an interface, not a class. you need to create an Object of a class that implements Comparable.

If T implements Comparable, than you can declare tmp as a T and use that:

 T tmp = a[j];
 a[j] = a[j - 1];
 a[j - 1] = tmp;
深陷 2024-12-20 10:52:41

使用 T tmp 而不是 Comparable tmp,我认为这应该可以修复它。

instead of Comparable tmp, use T tmp and that should fix it I think.

灯角 2024-12-20 10:52:41

代码中需要注意的事项:

  • T 的定义是递归的。如果需要的话可以制定一个界面。
  • 正如编译器明确指出的那样,您的分配是错误的! :-)

    Comparable tmp = a[j];

这会起作用,因为这是真实且正确的。由于 T 扩展了 Comparable,因此 T 是一个 Comparable。

  a[j - 1] = tmp;

这是行不通的,因为您试图将超类实例分配给子类实例。 Comparable 不保证具有 T 行为。因此出现了错误。

您可以尝试参数化该函数所在的类。使用该参数来定义 T。同样,您可能需要使用接口。除非我们更多地了解其他相关的设计目标,否则很难提供建议。就代码而言,该错误是正确且合理的。

Things to note down in your code:

  • Your definition of T is recursive. May be work out an interface if you need to.
  • Your assignment is wrong as clearly pointed out by the compiler! :-)

    Comparable tmp = a[j];

this will work, because this is true and correct. Since T extends Comparable, T is-a Comparable.

  a[j - 1] = tmp;

This will not work, because you are trying to assign a superclass instance to a subclass instance. Comparable is not guaranteed to have T behavior. Hence the error.

You can try and parameterize your class in which this function lies. Use that parameter to define T. Again, You may need to work with interfaces. Unless we know more about the other related design goals, difficult to advice. Code wise, the error is correct and justified.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文