java泛型限定符编译报错,找不到合适的方法,参数不匹配

package demo;

import java.util.ArrayList;

import java.util.List;

import java.util.function.Supplier;

public class Test {

public class Result<T> {

}

public class Response {

}

public class DemoResponse extends Response {

}

public class Demo2Response extends Response {

}

public static void main(String[] args) {

List<Supplier<Result<? super Response>>> test = new ArrayList<>();

Supplier<Result<DemoResponse>> arg = (new Test()).getArg();

test.add(arg); // 编译过不去,这是为什么呢

Supplier<Result<Demo2Response>> arg = (new Test()).getArg2();

test.add(arg2);// 编译过不去,这是为什么呢

}

public Supplier<Result<DemoResponse>> getArg() {

return Result::new;

}

public Supplier<Result<Demo2Response>> getArg2() {

return Result::new;

}

}

请教下这是为什么呢?


回答:

List<? super Response> ll = new ArrayList<>();

ll.add(new Demo2Response());

ll.add(new DemoResponse());

List<Supplier<? extend Response>> l2 = new ArrayList<>();

l2.add(DemoResponse::new);

l2.add(Demo2Response::new);

List<Supplier<Result<? extends Number>>> l3 = new ArrayList<>();

l3.add(()->new Result<Integer>());

l3.add(()->new Result<Double>());

这么编译能通过。不过我觉得最好还是简化一下吧。泛型的泛型 和 泛型的规则不一样


回答:

super是下界通配符,只能匹配Response的父类


回答:

List<Supplier<Result<? super Response>>> test = new ArrayList<>();
这里你应该使用 extends, ?后面内容范围大一点;
然后即使用extends也会报错, 因为test对象使用了上界通配符, 使用了上界通配符的它不能使用set方法.

以上是 java泛型限定符编译报错,找不到合适的方法,参数不匹配 的全部内容, 来源链接: utcz.com/p/944280.html

回到顶部