Java 我们是否可以创建具有泛型返回类型的方法,以及该方法如何在编译时计算要返回的类型?
我看到编译器允许以下方法。但是有人能解释一下在编译时返回类型是如何决定的吗?T的值是多少。 您还可以给我参考文档或视频,让我进一步了解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 {
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");