java中的通用方法没有返回期望的类型

时间:2017-03-03 05:55:19

标签: java generics

我创建了一个通用方法toList():

public static <T> List<T> toList(T... args){
        List<T> list = new ArrayList<T>();
        for (T t : args) {
            list.add(t);
        }

        if(list instanceof Comparable<?>){
            System.out.println("The list was considered a list of Comparable objects");
        }
        if(list instanceof Serializable){
            System.out.println("The list was considered a list of Serializable objects");
        }
        if(list instanceof Object){
            System.out.println("The list was considered a list of Object class' objects");
        }
        return list;
    }

我将此方法称为:

    public static void main(String[] args) {

        System.out.println(Generics.<Comparable>toList(1,2,"3"));
  }

我期待着因为我提供了Comparable类型,所以第一个if条件将保持为真,而o / p将是第一个Comparable,然后是Object。 但令我惊讶的是,如果o / p是Serializable然后是Object,那么控制权不会先进入。

有人能否说明这背后的原因? 另外,我不清楚在访问修饰符之后在方法签名中应用T的概念。

我们已经提到了访问说明符,修饰符和返回类型。提供T的需要是什么?

2 个答案:

答案 0 :(得分:5)

您正在列表对象上执行断言,而不是列表元素。

^20209[[:digit:]]{8}[[:digit:]]+(?=0{4})

如果列表本身实现list instanceof Comparable<?> 接口,则只会返回true。 由于Comparable是可序列化的,当然是一个对象,其他两个条件将评估为ArrayList

答案 1 :(得分:0)

在我看来,您要尝试的是在方法中测试元素类型 //var dataString = $(this).serializeArray(); if(memname==''||address==''||phonenumber==''||renewaldate==''||maxborrowlimit==''||status=='') { document.getElementById("display").innerHTML="Please Fill All The Fields"; } else if(!validate4(memname)) { document.getElementById("display").innerHTML="Please Enter Valid MemberName"; document.getElementById("name").focus(); } else if(d<currentdate) { document.getElementById("display").innerHTML="Please Enter RenewalDate After t=The Current Date"; } else if(!validatephonenumber(phonenumber)) { document.getElementById("display").innerHTML="Please Enter Valid PhoneNumber"; document.getElementById("phno").focus(); } else if(!validate5(maxborrowlimit)) { document.getElementById("display").innerHTML="Please Enter Valid MaxBorrowLimit>0"; document.getElementById("maxborrowlimit").focus(); } else { $.ajax({ type: "POST", url: "db/memaddajax.php", data: dataString, cache: false, success: function(result){ //alert("submitted"+result); $('#display').html(result); window.location.href="members.php"; }, error: function (xhr, ajaxOptions, thrownError) { alert(xhr.status); alert(thrownError); } }); } e.preventDefault(); }); function validatephonenumber(phonenumber) { var p=phonenumber; var filter=/^[789]\d{9}$/; if(filter.test(p)) { return true; } else { return false; } } function validate4(memname) { var m=memname; var filter=/^[A-Za-z ]+$/g; if(filter.test(m)) { return true; } else { return false; } } function validate5(maxborrowlimit) { var a = maxborrowlimit; var filter=/^[1-9][0-9]*$/; if(filter.test(a)) { return true; } else { return false; } } }); 。因为type erasure (follow the link)你无法做到这一点。 T的实际类型仅在编译时已知,而不是在运行时。在运行时,在方法内部,Java只会认为TT