相关疑难解决方法(0)

获取原则的解释

我读过O'Reilly的书,因为我开始了解这个获取原则.

  • extends仅从结构中获取值时使用通配符.
  • super仅在值放入结构时使用通配符.
  • 当你们想要从一个结构中获取和放置时,不要使用通配符.

例外情况是:

  • extends除了null属于每个引用类型的值之外,您不能将任何内容放入使用通配符声明的类型中.

  • super除了type的值之外,您不能从使用通配符声明的类型中获取任何内容Object,这是每种引用类型的超类型.

任何人都可以帮助我深入探索这条规则吗?如果可能的话,请将它们分层.

java generics

77
推荐指数
1
解决办法
3万
查看次数

<T>列表<?扩展T> f()一个有用的签名?它/使用它有什么问题吗?

<T> List<? extends T> f()签名是否有用?它/使用它有什么问题吗?

这是一个面试问题.我知道这个:

  1. 它汇编很好
  2. 使用它List<? extends Number> lst = obj.<Number>f(),然后我只能在lst上调用那些在签名中不包含T的List方法(比如isEmpty(),size(),但不能添加(T),删除(T)

这完全回答了这个问题吗?

java generics signature

35
推荐指数
2
解决办法
2210
查看次数

<?超级E>和<?扩展E> for List

具有以下简单的类结构:

class A {
}

class B extends A {
}

class C extends B {
}
Run Code Online (Sandbox Code Playgroud)

我正在创建一个ArrayList来保存先前创建的类的对象:

List<? extends A> list1 = new ArrayList<A>();
List<? extends B> list2 = new ArrayList<B>();
List<? extends C> list3 = new ArrayList<C>();

List<? super A> list4 = new ArrayList<A>();
List<? super B> list5 = new ArrayList<B>();
List<? super C> list6 = new ArrayList<C>();
Run Code Online (Sandbox Code Playgroud)

对于每个列表,我正在尝试添加每个先前创建的类的1个对象:A,B,C.唯一可能的组合是:

  • 将类A,B,C的对象添加到list4

  • 将类B和C的对象添加到list5

  • 将类C的对象添加到列表list6.其余的尝试给出了编译器错误,例如:

类型List中的方法add(capture#1-of?extends A)不适用于参数(A)

为什么我不能将类A,B,C的任何对象添加到list1/2/3?为什么例如list4接受类A,B,C的对象,如果它们应该是A类的超类,因为list4是定义的?

java generics

18
推荐指数
1
解决办法
7176
查看次数

如何将元素添加到通配符通用集合中?

为什么我用这个Java代码会出现编译器错误?

1  public List<? extends Foo> getFoos()
2  {
3    List<? extends Foo> foos = new ArrayList<? extends Foo>();
4    foos.add(new SubFoo());
5    return foos;
6  }
Run Code Online (Sandbox Code Playgroud)

其中'SubFoo'是实现Foo的具体类,而Foo是一个接口.

我用这段代码得到的错误:

  • 在第3行:"无法实例化ArrayList <?extends Foo>"
  • 在第4行:"方法添加(捕获#1-of?extends Foo)在类型List <capture#1-of?extends Foo>中不适用于参数(SubFoo)"

更新:感谢Jeff C,我可以更改第3行来说"new ArrayList <Foo>();".但我仍然遇到第4行的问题.

java generics

16
推荐指数
3
解决办法
2万
查看次数

集<?扩展T> vs Collection <T>

在尝试理解Spring MVC中的概念之后,我遇到了Collection<? extends Book>我以前从未见过的表达式.我试图自己搞清楚,但我发现使用Collection<? extends Book>和没有区别Collection<Book>.我猜它只允许Book的扩展,但它确实允许Book.抓那个.我曾尝试使用谷歌,但从那以后?是google中的通配符,它​​几乎不可能搜索.我已经搜索了stackoverflow以获得答案,但所有关于此问题的问题(例如List <?extends MyType><?extends> Java语法)已经知道了Collection<? extends T>.这段代码最初引起了我的兴趣:

import java.util.ArrayList;
import java.util.Collection;

public class Book {
    public static void main(String[] args) {
        BookCase bookCase1 = new BookCase();
        BookCase bookCase2 = new BookCase(bookCase1);
    }
}

class BookCase extends ArrayList<Book> {
    public BookCase() {
    }

    //acts same as public BookCase(Collection<Book> c) {
    public BookCase(Collection<? extends Book> c) {
        super(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

怎么<? extends T> …

java syntax extends

11
推荐指数
3
解决办法
9738
查看次数

标签 统计

java ×5

generics ×4

extends ×1

signature ×1

syntax ×1