Java 我们是否可以创建具有泛型返回类型的方法,以及该方法如何在编译时计算要返回的类型?

Java 我们是否可以创建具有泛型返回类型的方法,以及该方法如何在编译时计算要返回的类型?,java,generics,Java,Generics,我看到编译器允许以下方法。但是有人能解释一下在编译时返回类型是如何决定的吗?T的值是多少。 您还可以给我参考文档或视频,让我进一步了解java编译器如何在内部决定泛型类型 public <T> T getValue(String abc) throws Exception { if(abc.equals("x")){ return (T) new String[]{"x","y","z"}; } else {

我看到编译器允许以下方法。但是有人能解释一下在编译时返回类型是如何决定的吗?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";
        }
    }

你不能一般地这样做

最好使用非泛型方法,返回一个公共超类—在本例中为Object:

这将使调用者承担将对象强制转换为适当类型的负担,您可能会对此犹豫不决。但请注意,您当前的方法也会这样做,因为没有什么可以阻止他们编写以下内容:

String s = getValue("x");
String[] arr = getValue("x");
这两个都很好,但其中一个在运行时会失败。调用者必须知道哪些调用将返回字符串,哪些调用将返回字符串[]

强迫他们做演员的好处是,这样他们就可以看到演员,并且知道他们必须小心


更好的方法是在所有情况下都返回相同类型的值:返回新字符串[]{abc}。

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

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

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

Integer value = obj.<Integer>getValue("string");
没有编译时错误,但在运行时它将尝试应用强制转换返回整数abc;你会得到ClassCastException


请参阅有关的详细信息,并且

T由方法的调用方指定。如果T与该方法试图返回的对象不兼容,则在运行时会出现异常。@khelwood在上述场景中,调用方如何指定T?它仅用于返回类型..例如instance.getValuex。为什么不试着调用这个方法,看看它是如何工作的呢?@khelwood,好的。不知道我们也可以这样打电话。我将对此进行探讨。谢谢。在return语句中没有转换为整数。当您使用返回值(例如整数a=obj.getValue;)时,将完成此操作;,而不是用于语句,例如obj.getValue;。
Integer value = obj.<Integer>getValue("string");