gpt4 book ai didi

java - Arraylist 泛型/通配符礼仪

转载 作者:行者123 更新时间:2023-11-30 02:36:24 25 4
gpt4 key购买 nike

我希望了解其中每一个的所有详细原因/动机/用途,但是有很多组合,而对我来说一切似乎都是一样的,我对我认为的细微差别感到困惑称为泛型(通配符、对象、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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com