当前位置: 首页 > 知识库问答 >
问题:

数组泛型/通配符礼仪

米俊喆
2023-03-14

我想了解每一个的所有详细原因/动机/用途,但有这么多的组合,虽然对我来说似乎都是一样的,我对我认为的泛型的细微差别感到困惑(通配符、Object、T、E等,不知道所有这些是否都属于泛型)

如果我有这样的东西,我想制作一个数组列表:

Media<T> //Baseclass
Book<T> //Subclass
Movie<T> //Subclass

在这种情况下,哪一个最适合制造/使用,为什么?(如有必要,假设我只在这些书、电影中使用String和Integer):

  • <代码>阵列列表

如果基类是抽象的,这会影响选择吗?

我知道Object是超超类,“可以采用任何形式”,我知道通配符表示下一个html" target="_blank">对象可能是任何类型的,但E和T也是这样,对吗?我知道吗?扩展媒体意味着它将是一种媒体。在我看来一切都是一样的,否则,我不知道如何证明一个具体的选择。

编辑:下面的完整示例

import java.awt.*;
import java.util.ArrayList;

public class Something {

    public class Media<T>{
        T data;
        public T getData(){ return this.data; }
        public void setData(T data){ this.data = data; }
    }
    public class Book<T> extends Media<T>{
        T data;
        @Override
        public T getData(){ return this.data; }
        @Override
        public void setData(T data){ this.data = data; }
    }
    public class Movie<T> extends Media<T>{
        T data;
        @Override
        public T getData(){ return this.data; }
        @Override
        public void setData(T data){ this.data = data; }
    }

    ArrayList<Media> arrList;

    public Something() {
         this.arrList = new ArrayList<Media>();
         this.arrList.add(new Book<Integer>());
         this.arrList.add(new Movie<String>());

         this.arrList.get(0).setData(12);
         this.arrList.get(1).setData("Hello");

         System.out.println(this.arrList.get(0).getData()+10);
         System.out.println(this.arrList.get(1).getData()+10);
    }

    public static void main(String[] args) {
        Something s = new Something();
    }

}

共有1个答案

翟奕
2023-03-14

这不是一个完整的答案,但是请参阅这个关于在泛型类型规范中使用“超级”或“扩展”的效果的问题。简短的版本是Collection

出于这个原因,我个人更喜欢完全避免这两个限定符,因为它们通常比简单的集合更具限制性

但是,在为反方差和反方差目的设计API时,它们有时很有用(参见此问题)

<代码>集合

 类似资料:
  • 问题内容: 我对Java中的通用通配符有两个疑问: 和之间有什么区别? 什么是有界通配符,什么是无界通配符? 问题答案: 在你的第一个问题中,并且是有界通配符的示例。无限制的通配符看起来像,基本上就是<? extends Object>。宽松地表示泛型可以是任何类型。有界通配符(或)通过说它必须扩展特定类型(称为上限)或必须是特定类型的祖先(称为下限)来对类型进行限制。

  • 所以我在阅读泛型以重新熟悉这些概念,尤其是在涉及通配符的地方,因为我很少使用或遇到通配符。从我的阅读中,我不明白他们为什么使用通配符。下面是我经常遇到的一个例子。 你为什么不这样写: oracle网站上的另一个示例: 为什么这不是写成 我错过什么了吗?

  • 问题内容: 我试图理解Java泛型,它们似乎很难理解。例如,这很好… …就是这个… … 还有这个 … …但是不能编译: 有人可以用简单的语言解释发生了什么吗? 问题答案: 对于泛型类型,主要要了解的是它们不是协变的。 因此,尽管您可以这样做: 以下内容将无法编译: 这是为了避免您绕过通用类型的情况: 因此,一一讲解您的示例 1个 您的通用方法采用a ,而您采用;(基本上是)。可以分配给类型,并且编

  • 问题内容: 为什么以下代码无法编译? 错误是 java:不兼容的类型:无法转换为 但我不明白为什么不捕获通配符。 问题答案: 这里的子类型关系为: (我在回答“无法从转换List<List>为List<List<?>>”中解释了这一点。) 因此,基本上它不会编译,因为它是横向转换。 如果可能的话,您可以执行我在那边描述的转换: 如果您无法进行转换,则可能只需要处理raw bound即可。主要由于警

  • 这2个功能有什么区别? 我看到了相同的输出。

  • 问题内容: 我正在刷新有关Java泛型的知识。因此,我转向了Oracle的优秀教程……并开始为我的同事编写一个演示文稿。我在本教程中遇到了有关通配符的部分,内容为: 考虑以下方法,printList: printList的目标是打印任何类型的列表,但未能实现该目标- 它仅打印Object实例的列表;它不能打印,,,等等,因为它们不是的亚型。要编写通用的printList方法,请使用: 我知道那是行