- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望了解其中每一个的所有详细原因/动机/用途,但是有很多组合,而对我来说一切似乎都是一样的,我对我认为的细微差别感到困惑称为泛型(通配符、对象、T、E 等,不知道是否所有都属于泛型)
如果我有这样的东西,我想制作一个数组列表:
Media<T> //Baseclass
Book<T> //Subclass
Movie<T> //Subclass
在这种情况下,哪一个最适合制作/使用,为什么?(如果有必要,我们假设我只会对这些书籍、电影使用字符串和整数):
ArrayList<Media> = new ArrayList<Media>;
ArrayList<Media<T>> = new ArrayList<Media<T>>;
ArrayList<Media<?>> = new ArrayList<Media<?>>;
ArrayList<? extends Media> = new ArrayList<? extends Media>;
ArrayList<Object> = new ArrayList<Object>;
ArrayList<> = new ArrayList<>;
如果基类是抽象的,这会产生差异/影响选择吗?
我知道 Object 是超父类(super class)并且“可以采用任何形式”,我知道通配符表明下一个对象可能是任何类型,但 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();
}
}
最佳答案
这不是完整的答案,但请参阅 this question关于在泛型类型规范中使用“super”或“extends”的效果。简短的版本是 Collection<? extends T>
Collection<? super T>
时为只读是仅附加的。
出于这个原因,我个人更喜欢完全避免这两个限定符,因为它们通常比简单的 Collection<T>
更具限制性。 .
但是,在设计用于相反和反方差目的的 API 时,它们有时很有用(请参阅 this question )
Collection<?>
我仅在处理遗留代码(不使用泛型)时使用以避免编译器警告。它实际上与 Collection<Object>
相同,但对我来说更清楚。我尽量不编写需要 <?>
的新代码
关于java - Arraylist 泛型/通配符礼仪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42935455/
情况:我正在实现一个类似列表的容器,该容器支持 Pop() 函数,该函数应向用户返回存储在容器前端的 const char*。但是,作为实现者,我不确定我是否应该返回原始的 const char*(从
我只是想以非常好的面向对象方式编写一个 Pong 游戏。在我的第三堂课上,我已经面临第一个问题。 到目前为止,这是我的代码: Pong.java package PongOO; import java
假设我有两个 Python 模块: module1.py: import module2 def myFunct(): print "called from module1" module2.py:
我有一张 table 。例如: apple big pickle small 经过一些花哨的 jQuery... apple big 10kg -----
我可以想到我的代码允许 ViewController 交互的四种方式: 1. 如果我将一个新的 VC 调用到堆栈上,我会向它传递准备转场所需的数据,如下所示: 2. 当我倒退并返回 VC 时,Unwi
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
我是一名优秀的程序员,十分优秀!