有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java“<T>T get()”是什么意思?(它有用吗?)

这似乎是有效的Java语法:

<T> T get();

但这意味着什么?它有用吗


对下层选民的澄清

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

T get(Class<T> clazz);

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

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


共 (3) 个答案

  1. # 1 楼答案

    But what does it mean?

    这意味着该语言有一套尽可能简单的规则,在这里,它们以一种不太有用的方式结合在一起

    泛型方法具有类型参数。类型参数可以在返回类型、参数列表和方法体中使用。它可以用于任何组合,包括完全不使用

    例如,这些签名可能都很有用:

    <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()的情况使用相同的规则,但组合方式不同

    And is it useful?

    不特别。您还没有展示一个实现@LouisWasserman在一篇有见地的评论中指出,一个实现要么必须抛出、返回null,要么就是一个黑客

    下面是一个黑客的例子。我不认为它有用,因为有一种更简单的方法来实现这一点。em>也许如果您正在从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. # 2 楼答案

    它是您将返回值赋给的变量的类型

    例如。 如果你有这样的方法:

    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();
    
  3. # 3 楼答案

    这意味着一切都是真的。下面的代码将编译,带有警告,然后是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";
        }
    }