这似乎是有效的Java语法:
<T> T get();
但它是什么意思?它有用吗?
DOWNVOTERS澄清
我理解在方法参数中使用T
时的含义,如下所示:
T get(Class<T> clazz);
返回类型可以从传入的类中推断出来。
但是当你没有参数来说出T是什么类型时,它是什么类型的?
答案 0 :(得分:1)
这是您将返回值分配给的变量的类型。
e.g。 如果您有这样的方法:
public static <T> T getGenericNumber() {
// the number-generator might return int, double, float etc. values
return (T) numberGenerator.getANumber();
}
例如,您可以将方法的返回值直接指定为double值 - 不使用强制转换:
Double a = getGenericNumber();
所以你基本上已经将你的演员从变量的声明转移到了方法中。
这有潜在危险,因为您可以轻松生成强制转换异常,因为您可以执行此类操作 - 并且仍然可以编译:
String s = getGenericNumber();
答案 1 :(得分:1)
但它是什么意思?
这意味着该语言有一套尽可能简单的规则,在这里它们以一种非常有用的方式组合在一起。
泛型方法具有类型参数。类型参数可以在方法体中的参数列表中的返回类型中使用。它可以用于任何组合,包括根本没有。
例如,这些签名都很有用:
<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,要么是黑客。
这是一个黑客的例子。我不认为它有用,因为有一种更简单的方法可以做到这一点。 也许如果您从C转换为Java,并希望代码尽可能保持并行,那么它将非常有用。
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 );
}
}
答案 2 :(得分:0)
这真的意味着粗暴。下面的代码将编译,带有警告,然后是barf。在没有声明/推断某种类型的东西的情况下输入方法没有充分的理由。
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";
}
}