当前位置: 首页 > 面试题库 >

推断的类型不能有效替代Comparable泛型类型

诸葛雅达
2023-03-14
问题内容

考虑以下代码:

public abstract class Item<T> implements Comparable<T>
{
    protected T item;

    public int compareTo(T o)
    {
        return 0; // this doesn't matter for the time being
    }
}

public class MyItem<T> extends Item<String>
{
    T object;
}

public class Foo<T>
{
    protected ArrayList<T> list;
}

public class Bar<V> extends Foo<MyItem<V>>
{
    public void sort()
    {
        Collections.sort(list);
    }
}

排序调用给出错误:

绑定不匹配:类型为Collections的通用方法sort(List )不适用于参数(ArrayList >)。推断的类型MyItem 不是有效替代边界参数<T扩展Comparable <?超级T>>

为什么会这样呢?

如果MyItem<V>实施该工具,Comparable那为什么不能替代呢?

抱歉,是否有人提出这个问题,但我觉得这个问题有些具体。


问题答案:

实际上,对该错误的更详细说明可以使您javac自己:

java:找不到适合的方法sort(java.util.ArrayList<MyItem<V>>

方法java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>)不适用(由于实际和正式参数列表的长度不同,因此无法从参数实例化)

方法java.util.Collections.<T>sort(java.util.List<T>)是不适用(推断类型不符合声明结合(一个或多个)推断:MyItem<V>结合(一个或多个):
java.lang.Comparable<? super MyItem<V>>

因此,主要问题是:
为什么methodCollections.<T>sort(java.util.List<T>))不适用?

答案是
因为在Collections.<T>sort(java.util.List<T>)方法声明中参数T:是有界的<T extends Comparable<? super T>>

换句话说,T必须Comparable在其自身上实现接口。例如String类实现这样的接口:...implements ... Comparable<String>

在您的情况下,Item类未实现此类接口:

Item<T> implements Comparable<T>Item<T> implements Comparable<Item<T>>

因此,为解决此问题,您应将您的Item班级更改为此:

public abstract class Item<T> implements Comparable<Item<T>>
{
    protected T item;

    public int compareTo(Item<T> o)
    {
        return 0; // this doesn't matter for the time being
    }
}


 类似资料:
  • 我的错误:(上面的行)绑定不匹配:MyUtil类型的泛型方法bubbleSort(List,List)不适用于参数(ArrayList,ArrayList)。推断的类型Country不是有界参数>}的有效替代品

  • 我正面临以下问题: “链”来自ViewModelHelper类定义 2) 2.1),->可以用替换 如果我将2.1)应用于1.1)&1.2),我们可以看到,参数T是一致的 从1)遵循从2)遵循,从2.1)遵循可以被替换,如果我正确理解,这个错误应该不会出现,有人能解释一下吗?为什么eclipse会给我这个错误? 谢谢!

  • 问题内容: Java通常可以基于参数(甚至与返回类型(例如,与C#相反))来推断泛型。 恰当的例子:我有一个通用类,它只存储一对值,并且可以按以下方式使用: 该方法如下所示: 非常好。但是,这不再适用于以下需要通配符的用例: (请注意显式强制转换以进行正确的类型。) 代码失败,并显示以下错误(由Eclipse提供): 类型不匹配:无法从转换为 但是,显式调用构造函数仍然可以按预期工作: 有人可以解

  • 问题内容: 以下代码在t3行中出现编译错误: 错误消息是: 类型不匹配:无法从对象转换为T 我知道我可以使用强制转换或手动绑定来解决问题,我的问题是: 编译器进行自动绑定是否如此困难,是否会失败? 编辑:添加了错误消息。 编辑:添加了另一个示例如何不会发生该错误。 编辑:删除了第二个示例,因为它令人困惑,使问题更加清楚。 问题答案: 在第一种情况下,您有两个具有名为的类型参数的泛型方法,但是这些类

  • 我需要 Kotlin 中的一个集合来仅包含实现给定接口的元素。 例如:包含动物集合的地图: 通过阅读文档、博客和SO问题,我编写了使用Generics in关键字的代码: 现在我想在Test类中添加一个读取“data”内容的方法,例如将其打印到控制台: 如果我这样做,我会遇到编译错误: 我的解决方案是强制我的动物进入一个ArrayList 但是我不确定这是编写这种代码的最好方式。有没有更好的方式告

  • 问题内容: 我了解编译器使用目标类型来确定使通用方法调用适用的类型参数。例如,在以下语句中: 其中的签名中具有类型参数 在这种情况下,推断出的类型参数是。 现在考虑以下几点: 在这种情况下,推断的类型是什么?是吗 还是因为通配符告诉编译器任何类型都是可能的? 问题答案: 通配符的每种用法都有与之关联的不同类型。(通常,JLS将此称为“新鲜类型”。)例如,这就是这样的编译器错误的工作方式: 因为在这