如何在不使用Java泛型的情况下解决对compareTo(T)的未经检查的调用

时间:2019-03-09 17:38:53

标签: java generics comparable unchecked

我想解决此编译器警告:

public function cities_meta_box($post, $box)
{
    $defaults = array('taxonomy' => 'category');

    if (!isset($box['args']) || !is_array($box['args'])):
        $args = array();
    else:
        $args = $box['args'];
    endif;

    extract(wp_parse_args($args, $defaults), EXTR_SKIP);
    $tax = get_taxonomy($taxonomy);
    echo '<div id="taxonomy-'.$taxonomy.'" class="acf-taxonomy-field categorydiv">';

    $name = ($taxonomy == 'category') ? 'post_category' : 'tax_input[' . $taxonomy . ']';
    echo "<input type='hidden' name='{$name}[]' value='0' />";
    $term_obj = wp_get_object_terms($post->ID, $taxonomy);
    echo '<ul id="'.$taxonomy.'checklist" data-wp-lists="list:'.$taxonomy.'"
    class="categorychecklist form-no-clear"></ul>';
    // var_dump($term_obj);

    wp_dropdown_categories(array(
        'taxonomy' => $taxonomy,
        'hide_empty' => 0,
        'name' => "{$name}[]",
        'selected' => $term_obj[0]->slug,
        'orderby' => 'name',
        'hierarchical' => 0,
        'show_option_none' => '&mdash;'
    ));

    echo '</div>';
}

我的目标是使用以下方法比较两个未知类型(背景)的unchecked call to compareTo(T) as member of the raw type java.lang.Comparable 对象。

java.lang.Object

我知道问题在于方法将两个对象都强制转换为public static boolean Compare(Object o1, Object o2) { //check if both classes are the same if(!o1.getClass().equals(o2.getClass())) { return false; } if(Comparable.class.isAssignableFrom(o1.getClass()) && Comparable.class.isAssignableFrom(o2.getClass())) { //only if both objects implement comparable return Comparable.class.cast(o1).compareTo(Comparable.class.cast(o2)) == 0; } //other comparison techniques... } Comparable),但是Comparable<Object>并未实现Object

代码本身可以工作,但是编译器在使用其-Xlint:unchecked参数时会发出警告。

目标:

  • 删除编译器警告
  • 远离其他“未经检查”的警告
  • 避免使用@SupressWarning
  • 保持比较方法非通用

1 个答案:

答案 0 :(得分:0)

您不能轻易逃避编译器警告。告诉您何时进行的类型操作可能会在运行时中断,这是它的工作。实现目标的唯一方法是进行更多未经检查的操作,例如:

    if(Comparable.class.isAssignableFrom(o1.getClass()) 
            && Comparable.class.isAssignableFrom(o2.getClass())) {
        // Cache this somewhere if you're really going to use it
        Method compareTo = Comparable.class.getMethod("compareTo", Object.class);
        Integer result = (Integer) compareTo.invoke(o1, o2);

        return result == 0;

    }

最好的选择是在转换对象时仍然使用@SuppressWarnings一次,然后继续进行。如果由于某种原因不能保证参数的类型安全,则可以使用它。