繁体   English   中英

我们可以创建具有通用返回类型的方法吗,它如何评估在编译时返回哪种类型?

[英]Can we create method with generic return type and how does this evaluate which type to return at compile time?

我看到编译器允许以下方法。 但是任何人都可以解释在编译时如何确定返回类型。T的值是什么。还可以给我提供参考文档或视频,在其中我可以进一步了解java编译器将如何在内部确定泛型类型。 。

public <T> T getValue(String abc) throws Exception {
        if(abc.equals("x")){
            return (T) new String[]{"x","y","z"};
        } else {
            return (T) "abc";
        }
    }

编译时有类型擦除过程。 从javadoc:

在类型擦除过程中,Java编译器将擦除所有类型参数,如果类型参数是有界的,则将每个参数替换为其第一个边界;如果类型参数是无界的,则将其替换为对象

因此,在您的示例中,所有T将被Object类型替换。 但是在执行期间,它将强制转换为您指定的类型。 例如:

Integer value = obj.<Integer>getValue("string");

没有编译时错误,但是在运行时它将尝试应用强制转换return (Integer) "abc"; 你会得到ClassCastException

查看有关擦除通用类型通用方法擦除的更多信息

您不能一般地这样做。

最好的办法是使用非泛型方法,返回一个公共的超类-在这种情况下, Object

public Object getValue(String abc) throws Exception {
    if(abc.equals("x")){
        return new String[]{"x","y","z"};
    } else {
        return "abc";
    }
}

这将负担加到了调用方上,以将对象转换为适当的类型,您可能会对此感到厌恶。 但是请注意,您当前的方法也可以这样做,因为没有什么可以阻止他们编写此代码:

String s = getValue("x");
String[] arr = getValue("x");

两者都很好,但是其中之一将在运行时失败。 调用者必须以某种方式知道哪个调用将返回String ,哪个调用将返回String[]

强迫他们进行投射的好处是,他们可以看到投射,并知道他们将必须保重。

更好的方法是在所有情况下都返回相同类型的值:而是返回new String[]{"abc"}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM