考虑以下代码:
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将此称为“新鲜类型”。)例如,这就是这样的编译器错误的工作方式: 因为在这