首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将泛型参数与静态compareObject方法一起使用

将泛型参数与静态compareObject方法一起使用
EN

Stack Overflow用户
提问于 2008-11-05 21:12:55
回答 5查看 1.3K关注 0票数 2

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

该方法旨在允许调用者通过传递给compareTo来比较两个对象,但如果对象是字符串,则以不区分大小写的方式进行比较。

代码语言:javascript
复制
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“)。

代码语言:javascript
复制
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);
}

有什么建议吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-11-05 21:32:57

我刚试过这个:

代码语言:javascript
复制
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()调用中给出一个未经检查的强制转换警告。

我试着把它改成

代码语言:javascript
复制
public static <T extends Comparable<T>> int compareObject(T o1, T o2) {

字符串检查编译失败(“不可转换类型: found: T,必需: String")。我想这一定很接近了。

编辑:正如评论中所指出的,这是一个bug in javac。第二种形式确实是正确的,但目前还不能编译。尽管看起来很疯狂,但这是一段没有任何警告的代码:

代码语言:javascript
复制
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的所有冗余强制转换。

票数 2
EN

Stack Overflow用户

发布于 2008-11-05 21:33:16

以下是您要查找的内容:

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2008-11-06 08:09:05

我希望您知道,这里的许多方法确实改变了方法的语义。使用原始方法,您可以比较不同类型的对象(如果它们允许这样做),但使用

代码语言:javascript
复制
public static <T extends Comparable<T>> int compareObject(T o1, T o2)

您不能再进行此比较。一个允许这样做的变种是

代码语言:javascript
复制
    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")可能会更好。有一件事叫做泛型的过度使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/266693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档