gpt4 book ai didi

java - 在静态 compareObject 方法中使用泛型参数

转载 作者:行者123 更新时间:2023-12-04 07:11:31 25 4
gpt4 key购买 nike

我想从这个通用实用方法(具有许多类似方法的较大类的一部分)中删除所有“未经检查”的警告。在紧要关头,我可以使用 @SuppressWarnings("unchecked") 但我想知道我是否可以正确使用泛型来避免警告。

该方法旨在允许调用者通过传递到 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) 行有一个编译错误“Comparable 类型中的方法 compareTo(capture#15-of ?) 不适用于参数 (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);
}

有什么建议?

最佳答案

我刚试过这个:

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) {

并且字符串检查无法编译(“不可转换类型:找到:T,需要:字符串”)。不过,我认为这应该很接近了。

编辑:正如评论中指出的,这是一个 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 的所有冗余强制转换。 .

关于java - 在静态 compareObject 方法中使用泛型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/266693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com