在Java中,之间的区别是什么?

18 浏览
0 Comments

在Java中,之间的区别是什么?

ListList有什么区别?

我之前用的是List,但它不允许我向其中添加元素list.add(e),而List则可以。

0
0 Comments

在Java中,有两种通配符类型:。这两种通配符类型的出现是为了解决在泛型中读取和写入的问题。

首先,我们来看通配符类型。当我们想要将一个元素写入一个List时,这个List需要是一个X的List或者是X可以向上转型为的任何超类的List。换句话说,我们可以将X及其子类的实例写入这个List中。这是因为我们希望List中的元素类型至少是X,这样才能确保我们可以将X写入List中。因此,我们可以使用以下通配符类型来声明这样的List:

List

接下来,我们来看通配符类型。当我们想要从一个List中读取一个元素时,这个List必须是X的List或者是X可以向上转型为的任何类型的List。换句话说,我们可以读取List中的元素,因为它们至少是X的子类。因此,我们可以使用以下通配符类型来声明这样的List:

List

通过使用这两种通配符类型,我们可以在泛型中实现更灵活的读取和写入操作,以满足不同的需求。

0
0 Comments

在Java中,之间的区别是什么?

在Java中,我们经常使用泛型来增强代码的可读性和安全性。泛型可以让我们在编译时捕捉到类型不匹配的错误,并提供更好的类型检查和安全性。

然而,在使用泛型时,我们可能会遇到一些困惑。其中一个困惑是之间的区别。这两个通配符用于限制泛型类型的范围,但它们有不同的作用。

表示泛型类型可以是T或T的任何子类型。这意味着我们可以将一个类型的对象赋值给一个T类型的引用变量。但是,我们不能将任何类型的对象添加到这个集合中,因为我们无法确定集合的实际类型。

例如,假设我们有一个泛型类型为List的集合。我们可以将一个List或List的对象赋值给它,因为它们都是Number的子类型。但是,我们不能将任何类型的Number对象添加到这个集合中,因为我们无法确定集合的真实类型。

另一方面,表示泛型类型可以是T或T的任何超类型。这意味着我们可以将一个T类型的对象添加到一个类型的集合中,因为集合可以容纳T或T的超类型的对象。

例如,假设我们有一个泛型类型为List的集合。我们可以将一个Integer对象添加到这个集合中,因为它是Integer类型的超类型。但是,我们不能将一个Number或Object类型的对象添加到这个集合中,因为集合的类型可能是List或List

总结一下,用于获取泛型类型的值,而用于添加泛型类型的值。这两个通配符的主要区别在于它们允许的操作。

解决这个问题的方法是根据需要选择合适的通配符。如果我们只需要从集合中获取值,并且不需要添加新的值,那么使用是合适的。如果我们需要添加新的值,那么使用是合适的。

希望这篇文章对你理解之间的区别有所帮助。

0
0 Comments

Java中的之间的区别是什么?

在Java中,泛型中的通配符有不同的用途。用于表示可以读取T类型或T的子类的列表,而用于表示可以写入T类型或T的超类的列表。

首先,我们来看的用法。通配符表示可以读取T类型或T的子类的列表。下面是一些的使用例子:

List foo3 = new ArrayList();  // Number "extends" Number (在这个上下文中)
List foo3 = new ArrayList(); // Integer extends Number
List foo3 = new ArrayList();  // Double extends Number

通过上面的示例,我们可以得出以下结论:

- 可以读取一个Number对象,因为可以将任何符合条件的列表赋值给foo3,这些列表都包含一个Number对象或Number的子类。

- 不能读取一个Integer对象,因为foo3可能指向一个List

- 不能读取一个Double对象,因为foo3可能指向一个List

接下来,让我们看一下的用法。通配符表示可以写入T类型或T的超类的列表。下面是一些的使用例子:

List foo3 = new ArrayList();  // Integer是Integer的"超类"(在这个上下文中)
List foo3 = new ArrayList();   // Number是Integer的超类
List foo3 = new ArrayList();   // Object是Integer的超类

通过上面的示例,我们可以得出以下结论:

- 无法确保读取到的是一个Integer对象,因为foo3可能指向一个List或List

- 无法确保读取到的是一个Number对象,因为foo3可能指向一个List

- 唯一的保证是你将会得到一个Object对象或Object的子类的实例(但你不知道是哪个子类)。

根据上面的解释,我们可以总结出PECS原则:生产者使用,消费者使用。如果你需要从列表中读取T类型的值,你需要声明它为;如果你需要向列表中写入T类型的值,你需要声明它为。如果你需要既读取又写入列表,你需要声明为具体的类型,而不是使用通配符。

最后,我们来看一个示例,说明了如何在Java中使用

public class Collections { 
  public static  void copy(List dest, List src) {
      for (int i = 0; i < src.size(); i++) 
        dest.set(i, src.get(i)); 
  } 
}

上面的示例展示了一个copy方法,它接受一个目标列表和一个源列表作为参数,并将源列表中的元素复制到目标列表中。

总结起来,了解和理解的区别非常重要。它们在泛型中有不同的用途,可以帮助你更好地使用和理解泛型的概念。

0