我想从这个通用的实用程序方法中删除所有“未检查的”警告(包含许多类似方法的更大类的一部分)。在紧要关头,我可以使用@SuppressWarnings(“未选中”),但我想知道是否可以正确使用泛型来避免警告。
该方法旨在允许调用者通过传递给compareTo来比较两个对象,但如果对象是字符串,则以不区分大小写的方式进行比较。
public static int compareObject(Comparable o1, Comparable o2)
{
if ((o1 instanceof String) && (o2 instanceof String))
return ((String) o1).toUpperCase().compareTo(((String) o2).toUpperCase());
else
return o1.compareTo(o2);
}这是我第一次(不正确的)尝试解决方案。参数工作得很好,但是o1.compareTo(o2)行有一个编译错误"The method compareTo(capture#15-of ?) in the type Comparable is not applicable for the argument (Comparable“)。
public static int compareObject(Comparable<?> o1, Comparable<?> o2)
{
if ((o1 instanceof String) && (o2 instanceof String))
return ((String) o1).toUpperCase().compareTo(((String) o2).toUpperCase());
else
return o1.compareTo(o2);
}有什么建议吗?
发布于 2008-11-05 21:32:57
我刚试过这个:
public static <T extends Comparable> int compareObject(T o1, T o2) {
if ((o1 instanceof String) && (o2 instanceof String))
return ((String) o1).toUpperCase().compareTo(((String) o2).toUpperCase());
else
return o1.compareTo(o2);
}它会进行编译,但会在compareTo()调用中给出一个未经检查的强制转换警告。
我试着把它改成
public static <T extends Comparable<T>> int compareObject(T o1, T o2) {字符串检查编译失败(“不可转换类型: found: T,必需: String")。我想这一定很接近了。
编辑:正如评论中所指出的,这是一个bug in javac。第二种形式确实是正确的,但目前还不能编译。尽管看起来很疯狂,但这是一段没有任何警告的代码:
public static <T extends Comparable<T>> int compareObject(T o1, T o2) {
if (((Object) o1 instanceof String) && ((Object) o2 instanceof String))
return ((String) (Object)o1).toUpperCase().compareTo(((String) (Object)o2).toUpperCase());
else
return o1.compareTo(o2);
}正如您所看到的,唯一的区别是到Object的所有冗余强制转换。
发布于 2008-11-05 21:33:16
以下是您要查找的内容:
public static <T extends Comparable<T>> int compareObject(T o1, T o2) {
if ((o1 instanceof String) && (o2 instanceof String))
return ((String) o1).toUpperCase().compareTo(((String) o2).toUpperCase());
else
return o1.compareTo(o2);
}发布于 2008-11-06 08:09:05
我希望您知道,这里的许多方法确实改变了方法的语义。使用原始方法,您可以比较不同类型的对象(如果它们允许这样做),但使用
public static <T extends Comparable<T>> int compareObject(T o1, T o2)您不能再进行此比较。一个允许这样做的变种是
public static int compareObject2(Comparable<Object> o1, Comparable<Object> o2) {
if (((Object) o1 instanceof String) && ((Object) o2 instanceof String))
return ((String) (Object)o1).toUpperCase().compareTo(((String) (Object)o2).toUpperCase());
else
return o1.compareTo(o2);
}(我插入了上述javac bug的变通方法。)但这并不能增强类型安全或任何东西,所以在这种情况下,使用更容易理解的非泛型方法并使用@SuppressWarnings("unchecked")可能会更好。有一件事叫做泛型的过度使用。
https://stackoverflow.com/questions/266693
复制相似问题