这似乎是有效的Java语法:
<T> T get();
但是这意味着什么?它有用吗?
给投票者的澄清说明
我了解当方法参数中使用T
时所表示的含义,例如:
T get(Class<T> clazz);
返回类型可以从传入的类中推断出来。
但是当你没有参数来说明类型T是什么时,它是什么类型?
这似乎是有效的Java语法:
<T> T get();
但是这意味着什么?它有用吗?
给投票者的澄清说明
我了解当方法参数中使用T
时所表示的含义,例如:
T get(Class<T> clazz);
返回类型可以从传入的类中推断出来。
但是当你没有参数来说明类型T是什么时,它是什么类型?
这是你将返回值赋给的变量类型。
例如,如果你有这样一个方法:
public static <T> T getGenericNumber() {
// the number-generator might return int, double, float etc. values
return (T) numberGenerator.getANumber();
}
Double a = getGenericNumber();
所以你基本上把变量的声明从方法中移动了出来。
这可能是危险的,因为你可以很容易地产生强制类型转换异常,例如你可以这样做 - 而仍然能够编译:
String s = getGenericNumber();
String s = getGenericNumber()
。但我理解你的意思。 - ᴇʟᴇvᴀтᴇ但是这意味着什么?
这意味着该语言具有一组旨在尽可能简单的规则,并且它们已经以一种不太实用的方式组合在一起。
泛型方法具有类型参数。类型参数可以在返回类型,参数列表和方法体中使用。它可以在其中任何一种组合中使用,包括完全不使用。
例如,这些签名都可以很有用:
<T> T foo( T t ) // The return type can be the type parameter
<T> List<T> ( ) // A type parameter does not have to be an argument
<T> T get()
的情况使用相同的规则,但以不同方式组合。
并不特别有用。您还没有展示实现方法。@LouisWasserman在一个深刻的评论中指出,实现要么会抛出异常,要么返回null,要么是一个hack。这有用吗?
public static class Union {
public Object o;
public Union( Object value ) { o = value; }
public Class<? extends Object> getType() { return o.getClass(); }
public <T> T value() {
return (T) o; // <-- uses type parameter to cast
}
}
public static void main(String[] args) {
Union union = new Union( "foo" );
Class<?> valueType = union.getType();
if ( valueType.equals( String.class )) {
String s = union.value(); // <-- the call
System.out.println( s );
}
}
实际上它什么都不表示。下面的代码将编译,但会带有警告,并且最终会出错。没有必要在某些时候不声明/推断类型的情况下键入该方法。
public class GenericExample {
public static void main(String[] args) {
String eejits = get();
System.out.println(eejits);
Integer knobends = get(); // Throws a ClassCastException.
}
private static <T> T get() {
return (T) "I love to downvote without explaining why";
}
}
更明确地说,这并不比这样做更好(也许你只需要在一个地方进行强制转换)。
public class GenericExample {
public static void main(String[] args) {
String s = (String) get();
System.out.println(s);
Integer i = (Integer) get();
}
private static Object get() {
return "I really hope the caller expects a String, cos otherwise I'm going to downvote them";
}
}