什么&#34; <t> T get()&#34;意思? (它有用吗?)

时间:2016-04-01 18:10:35

标签: java generics

这似乎是有效的Java语法:

<T> T get();

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

DOWNVOTERS澄清

我理解在方法参数中使用T时的含义,如下所示:

T get(Class<T> clazz);

返回类型可以从传入的类中推断出来。

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

3 个答案:

答案 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";
    }
}