有 Java 编程相关的问题?

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

java 5中引入泛型的原因

有人能解释一下Java中引入泛型的原因吗

据我所知,它们的引入是为了避免意外地将错误类型的对象添加到集合中

我有点喜欢集合的泛型,但不明白为什么它们也被添加到其他类中。我见过一些让你头疼、眼睛流血的通用类

那么引入泛型(主要针对非集合)的所有原因是什么

蒂亚


共 (6) 个答案

  1. # 1 楼答案

    之所以添加它们,是因为在原始Java中创建真正通用的占位符的唯一方法是使用Object类型的字段。这可以接受任何对象

    不幸的是,当您再次需要它时,它的类型是Object,它不包含任何有趣的方法,因此您需要将它转换为您碰巧知道它的类型。这些运行时强制转换是常见的错误源,本质上是在运行时发生的

    泛型将其移动到编译器,并导致LOT更少的classcastexception,从而提高质量。实际的语法有点冗长-这里的C#关键字'var'会有很大帮助-但是这一点额外的劳动会带来很大的回报

    我相信您必须使用Haskell这样的强类型语言进行编程,才能知道什么是可能的,以及为什么它是可取的

  2. # 2 楼答案

    Two main objectives of Generics concepts are
    
    1. To provide type safety to the collection so that they can hold only particular type of object
    
    2.To resolve type casting problems
    
    ArrayList<String> ob=new ArrayList<String>();
    
    ob.add("shail");
    ob.add("ball");
    ob.add(10);  //compile time error
    
    At the time of retrival does not require type casting
    
    String s1=ob.get(0);
    
  3. # 3 楼答案

    本质上是安全和方便

    Java通过一种称为类型擦除的机制实现其泛型,该机制在编译时有效地将泛型定义替换为非泛型定义。这样做的原因是为了保持API在1.4和1.5之间的兼容性-collections API可能已经更新,但是如果您在1.5中以非通用的方式访问它,它也会工作

    不同之处在于,如果希望集合只包含特定类型的对象,则可以在API中明确地编码该需求,并避免诸如接收包含错误类型对象的列表等问题,同时还需要明确地强制转换这些对象,从而使代码更易于阅读,减少错误俯卧的

    使用泛型的原因基本上与在集合中使用泛型的原因相同——当您需要说一个对象是其他对象的组合时,但是,这种组合可能有一系列的类型,一旦绑定了这些新对象,就意味着一种新的组合类型与其他类似的组合不相似。也就是说,字符串列表的类型类似于整数列表,但它们不再相互兼容

    一个例子是在Future中等待异步结果。Future类封装了异步结果的概念,但是Future的特定类型(如Future<String>)进一步指定了您可以期望的结果类型,并使其与Future<Integer>不同

  4. # 4 楼答案

    泛型为程序员提供了某种类型安全性。最明显的用途是防止用户无意中将错误类型传递到函数中。他们也可以用来避免大量的噪音铸造

    下面是一个非集合示例,它将受益于泛型。如果我们有许多与模型关联的视图,我们可以定义一个接口来表示视图。接口可能有一个getModel()方法:

    public interface View {
       Model getModel();
    }
    

    任何调用该方法的人都必须抛出结果,这是一个痛苦的过程:

    MyView view = new MyView();
    MyModel model = (MyModel) view.getModel();
    

    因此,我们将接口指定为泛型:

    public interface View<M extends Model> {
       M getModel();
    }
    

    一个名为MyView的具体类

    class MyView implements View<MyModel> {
      MyModel getModel();
    }
    

    那么客户端代码就更干净了:

    MyView view = new MyView();
    MyModel model = view.getModel();
    

    通过精心设计泛型,可以使代码更具可读性。但是,泛型类型信息不会编译到类文件中,因此在运行时仍有可能被滥用

  5. # 5 楼答案

    从Java的角度来看,Java集合框架没有什么特别之处,因此没有理由或需要只向该框架添加新的语言特性

    从用户的角度来看泛型:现在如果你有一个集合,你就知道里面有什么类型的对象了。这是一个很大的优势。只需比较以下代码段(不带泛型和带泛型):

    使用Java 1.5+

    List<Animal> zoo = new ArrayList<Animal>();
    for(Animal animal:zoo) {
      feed(animal);
    }
    

    在Java 1.5之前-

    List zoo = new ArrayList();
    for (int i = 0; i < zoo.size(); i++) {
      if (!(zoo.get(i) instanceof Animal)) {
        continue;
      } else {
        Animal animal = (Animal) zoo.get(i);
        feed(animal);
      }
    }
    

    从用户的角度来看,老款式更伤眼睛

  6. # 6 楼答案

    任何你想做泛型编程的地方;-)

    的确,您不介意(太多)某些对象的类型,但希望限制其类型以使其正常工作

    成像管及;过滤器。假设每个管道都有特定的输出。一个输出字节、其他字符串和其他数字。最好每个管道都有其特定的类型,并且您只能将X输出的管道连接到X输入的管道

    Byte -> Filter -> String -> Filter -> Integer

    因此,您的第一个过滤器将是Filter<Byte, String>,它的hookOutputPipe将接收一个Pipe<String>

    也许你的眼睛会因为过度参数化的类型而流血,但在某些情况下,这对于API开发人员来说是一个很好的选择。如果你开始在适当的情况下使用它们,你会感觉到它们的有用性

    来自现实世界的一个示例:GWT中的事件类型和处理程序类型