1

我希望返回类型参数是类型参数和方法参数的类型参数的超级参数。

这编译:

import java.util.List;
interface Foo<A> {
    <R, B extends R> List<R> eg1(List<B> unit);
    <R> List<R> eg2(List<? extends R> unit);
}

但它并不强制 R 也必须是 A 的超级。我怎么做?

实际上,我想做一些类似这些表达的事情:

<B, R super A & B> List<R> func(List<B> unit);
<B> List<? super A & B> func(List<B> unit);

但是这些当然不能编译。

这样做有两个目的:

  1. 我希望能够将结果分配给 A 和 B 的任何超类。
  2. 在此方法的实现中,我需要一个可以同时包含 A 和 B 的结果类型。所以第一个编译的例子是行不通的,因为它们不允许我在结果中加上 A。
4

2 回答 2

1

我认为您必须在类级别命名类型参数:

import java.util.List;
interface Foo<Base, A extends Base> {
    <B extends Base> List<Base> eg1(List<B> unit);
    <R> List<R> eg2(List<? extends R> unit);
}
于 2013-03-20T22:20:01.097 回答
0

感谢@LouisWasserman 的评论,我开始考虑我应该首先这样做的实现。某处必须指定要构造返回的类型。在方法实现中硬编码,指定为类型参数、参数类型参数等。无论该规范在哪里,都可以为该接口方法正确定义泛型。

换句话说,我试图做的事情没有意义,因为您无法构造返回类型。

于 2013-03-20T23:11:18.927 回答