代码之家  ›  专栏  ›  技术社区  ›  Paulo Guedes

名为的泛型方法如何知道泛型返回的类型?

  •  0
  • Paulo Guedes  · 技术社区  · 15 年前

    对于Java这个问题,我找不到一个复制品,尽管C语言中有很多问题。

    我有这个方法:

    public <T> T getSomething() {
     //
    }
    

    根据T的类型,我会有不同的回报。例如:

    String a = getSomething();
    int b = getSomething();
    

    为了 a ,我的方法将返回 String . 为了 b ,它将返回 int . 等等。

    看来这可以用 typeof() 在C语言中。如何在Java中实现它?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Gabe Timothy Khouri    15 年前

    不幸的是,对于Java来说,这是不可能的,因为它使用一种名为“类型擦除”的技术来允许泛型在不改变JVM的情况下工作。结果是,当调用该方法时,它只知道对象,因此它永远无法找出它要返回的类型。

        2
  •  0
  •   Steve B.    15 年前

    除非在getSomething方法中有一些代码,否则示例无法工作。如果我写

    public <T> T getSomething(){ return null;}
    

    它可以编译,但毫无意义。然而,你通常会从上下文中得到T:

    public class Foo<T>{ 
      public T getSomething()... 
    }
    new Foo<String>().getSomething()...
    

    可能在你的实现中会有一些类型感知的东西。

        3
  •  0
  •   Tom Hawtin - tackline    15 年前

    在Java中,编写类似于:

    public <T> List<T> getSomeThings() {
        //
    }
    

    那就行了。

    可能与你在C中所看到的情况直接对应的是:

    public <T> T getSomething(Class<? extends T> clazz) {
        //
    }
    

    但是会使用反射,这几乎肯定是个坏主意。当然,您可以使用BOG标准工厂避免反射:

    public <T> T getSomething(FactoryThing<? extends T> factory) {
        //
    }
    

    有时推断返回类型是有用的。例如,从Java序列化流中读取,其中由于前1.5个API设计,未经检查的CAST警告不能合理避免。我建议用一个包的私人方法来保持这一点。