【问题标题】:How to interpret "public <T> T readObjectData(... Class<T> type)" in Java?如何在 Java 中解释“public <T> T readObjectData(... Class<T> type)”?
【发布时间】:2013-03-31 02:13:38
【问题描述】:

我有这个 Java 代码。

public <T> T readObjectData(ByteBuffer buffer, Class<T> type) {
...
T retVal = (T) summaries;
return retVal;

如何解释这段代码?为什么我们需要public &lt;T&gt; T 而不是public T

如何将参数赋予第二个参数(Class&lt;T&gt; type)?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    这声明了readObjectData 方法泛型,带有一个类型参数T

    public <T> ...
    

    那么返回类型是T

    ... T readObjectData(...
    

    如果没有初始的&lt;T&gt;(即泛型类型声明),符号T 将是未定义的。

    在参数列表中,Class&lt;T&gt; type是参数之一。因为返回类型和这个参数都引用了T,这保证了如果你传入一个Class&lt;String&gt;,那么它将返回一个String。如果你传入一个Class&lt;Double&gt;,那么它将返回一个Double

    要传入参数,传入任何Class 对象,例如String.class.

    【讨论】:

      【解决方案2】:

      &lt;T&gt; 部分声明了一个泛型类型参数 T。如果省略这部分,编译器可能会抱怨T 类型不存在。

      在这种情况下,T 用作实际类型的占位符,只有在使用非泛型类型参数实际调用方法时才会确定。

      public <T> T readObjectData(...
              ^  ^
              |  + Return type
              + Generic type argument
      

      【讨论】:

        【解决方案3】:

        &lt;T&gt; 是一个参数类。没有名为T 的类。您可以将此方法与通过名为type 的第二个方法参数指定的任何类一起使用。

        因为方法定义如下:

        public &lt;T&gt; T readObjectData(ByteBuffer buffer, Class&lt;T&gt; type)

        你可以这样称呼它:

        MyClass obj = o.readObjectData(buffer, MyClass.class);

        请注意,您不必将readOjectData() 的返回值转换为MyClass。曾几何时,在 java 5 之前,这个方法会被定义为:

        public Object readObjectData(ByteBuffer)

        它的用法如下:

        MyClass obj = (MyClass)o.readObjectData(buffer);

        由于强制转换可能导致ClassCastException,这是一种不好的做法。这就是发明仿制药的原因。

        【讨论】:

          【解决方案4】:

          您可能对类似且更常见的声明感到困惑:

          class MyClass<T> {
             private  T myMethod(T a){
                 return  a;
             }
          }
          

          在上述情况下,不需要在私有(private &lt;T&gt; T myMethod(T a))之后"&lt;T&gt;"

          因为它使用的TMyClass&lt;T&gt; 类中定义的相同

          如果你写的话,更多

          class MyClass<T> {
             private <T> T myMethod(T a){
                 return  a;
             }
          }
          

          那么意思是 myMethod 返回类型(可能)不同于 MyClass 类型。好像你写了这个:

          class MyClass<T1> {
             private <T2> T2 myMethod(T2 a){
                 return  a;
             }
          }
          

          致谢:以“Kanagavelu Sugumar”对How to use Class<T> in Java? 的更长回答为例

          【讨论】:

            【解决方案5】:

            这是JsonPath 使用的模式,它允许您使用以下语义:

            String author        = JsonPath.read(json, "$.store.book[0].author");
            List<String> authors = JsonPath.read(json, "$.store.book[*].author");
            

            这是最接近动态编程语言(如 Javascript)中使用的鸭式打字的东西,目前可以用 Java 完成。

            【讨论】:

              猜你喜欢
              • 2011-09-24
              • 1970-01-01
              • 2016-07-16
              • 2014-12-12
              • 2016-08-28
              • 2011-11-09
              • 1970-01-01
              • 1970-01-01
              • 2014-01-19
              相关资源
              最近更新 更多