2016-04-01 47 views
0

这似乎是有效的Java语法:“<T> T get()”是什么意思? (而且是它有用吗?)

<T> T get(); 

但是这是什么意思?它有用吗?


澄清征求DOWNVOTERS

我明白当T的方法参数使用,这样就意味着:

T get(Class<T> clazz); 

的返回类型是那类inferrable通过英寸

但是,当你没有参数来说什么类型T是什么类型是它?

+0

这是返回'T'类型值的泛型方法。方法签名前面的''表明'T'是该方法的一个类型参数,而不是拥有它的类。 – dasblinkenlight

+3

无论调用者要求什么,这意味着它或者a)总是抛出,b)总是返回null,c)这是一个邪恶的黑客。 –

+0

@Louis Wasserman因此,本质上它留给调用者来决定类型,即它基本上是类型不安全的。那是对的吗?它有用吗? –

回答

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,要么成为

下面是一个例子hack。我不认为它有用,因为有一个更简单的方法来实现这一点。 也许如果您从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); 
    } 
} 
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"; 
    } 
} 
1

这是变量的要指定该报税表的类型价值。

例如 如果你有这样一个方法:

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(); 
+1

嗯,我不认为你可以'String s = getGenericNumber()',如果你明确地将它绑定到'extends Number'。但我明白你的观点。 –

+0

是的,你是对的 - 在这种情况下,你可以分配给数字 - 我会改变它 –