【问题标题】:What does Object<String> signify in Java?Java 中的 Object<String> 表示什么?
【发布时间】:2011-05-16 16:32:53
【问题描述】:

我是 Java 新手,但不是编程新手(我通常使用 Ruby 编写代码)。我在 Java 代码示例中看到的一件事是使用 而不是 () 将参数传递给对象。下面是一个代码示例(取自 Google Web Toolkit 教程):

public void onValueChange(ValueChangeEvent<String> event) {
    String token = event.getValue();

    // depending on the value of the token, do whatever you need
    ...
}

这与演员阵容有关还是其他原因?有人可以向我解释这意味着什么或用于什么吗?谢谢!

【问题讨论】:

    标签: java


    【解决方案1】:

    这是泛型类的type parameter。基本上,ValueChangeEvent&lt;String&gt; 表示通知侦听器值已更改的事件,在这种情况下,该值的类型为 String

    使用集合框架中的标准示例更容易理解:

    List&lt;String&gt; 是一个包含String 对象的List。与仅使用“原始类型”List 相比的优势在于,编译器将拒绝将除String 对象之外的任何内容放入List&lt;String&gt; 的代码,并允许从其中检索到的对象用作String 而无需强制转换。

    基本上,泛型允许使用更简洁的代码并提高 Java 代码的整体类型安全性,因为在许多情况下无需使用 Object 类型并从中转换值。

    【讨论】:

      【解决方案2】:

      它被称为泛型,或泛型参数。它们允许方法或对象在保持类型安全的同时对多种类型的数据进行操作。一种常见用途是指定存储在集合中的对象的类型。

      有关更多信息,请参阅有关该主题的wikipedia article

      【讨论】:

      • ...但正如 wiki 也会告诉你的那样,Java 中的泛型并不像类型安全,因为该死的类型擦除。
      • 它们提供了比 pre-generics java 更好的类型安全性,你必须返回一个 Object 并相信自己正确地转换它,不提供编译时检查。是的,类型擦除有时会很糟糕(尤其是数组),但总比没有好。
      【解决方案3】:

      尖括号的使用通常表示泛型编程方法,这是一种最初不声明类型的编程风格,使代码更具可重用性。

      例如:

      // Declare the generic class
      public class GenericList<T>
      {
          void Add(T input) { }
      }
      class TestGenericList
      {
          private class ExampleClass { }
          static void Main()
          {
              // Declare a list of type int
              GenericList<int> list1 = new GenericList<int>();
      
              // Declare a list of type string
              GenericList<string> list2 = new GenericList<string>();
      
              // Declare a list of type ExampleClass
              GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
          }
      }
      

      【讨论】:

        【解决方案4】:
        【解决方案5】:

        &lt;&gt; 表示泛型。看看Generics。例如,List&lt;String&gt; 是一个字符串列表。

        【讨论】:

          【解决方案6】:

          这在 java 中称为generics。它们类似于 C++ 中的templates

          它们基本上让你为任何类型实现一个泛型类,然后当你初始化这个类的一个变量时,你指定它应用它的东西的类型(例如 String、int、double 等)。一个很好的例子是在 ArrayList 中,容器应该存储什么类型?实现方式相同,只是类型不同。

          【讨论】:

          • 说它们类似于 C++ 中的模板是错误的 IMO,因为与泛型相比,模板从根本上工作在一个非常不同的级别。摩尔阅读:stackoverflow.com/questions/36347/…
          【解决方案7】:

          通常使用它,因此您可以相信集合/列表的元素是某种类型。

          例如,

          ArrayList<String> a = new ArrayList();
          a.add("Test");
          
          myFunctionWhichAcceptsString(a.get(0));
          

          如果 myFunctionWhichAcceptsString 只接受一个字符串作为参数,那么您将无法使用普通的 ArrayList 而不将结果转换为字符串,因为它存储了一个对象和对象≠字符串。通过这种方式,您是在说列表只能是字符串。您可以对任何类型的对象执行此操作。

          【讨论】:

            猜你喜欢
            • 2019-12-12
            • 1970-01-01
            • 1970-01-01
            • 2013-12-11
            • 2015-09-08
            • 2010-10-26
            • 1970-01-01
            • 1970-01-01
            • 2018-01-23
            相关资源
            最近更新 更多