使用泛型在 Java 中存储通用超类型
假设我有一个方法“mix”,它采用两个可能不同类型的T和S的列表,并返回一个包含两者元素的单个列表。对于类型安全,我想指定返回的列表是 R 类型,其中 R 是 T 和 S 通用的超类型。例如:
List<Number> foo = mix(
Arrays.asList<Integer>(1, 2, 3),
Arrays.asList<Double>(1.0, 2.0, 3.0)
);
要指定这一点,我可以将方法声明为
static <R, T extends R, S extends R> List<R> mix(List<T> ts, List<S> ss)
但是,如果我想在类上创建一个实例方法而不是静态方法怎么办?mix
List2<T>
<R, T extends R, S extends R> List<R> mix ...
阴影上的实例,所以这不好。<T>
List2
<R, T extends S&T, S extends R> List<R> mix ...
解决了重影问题,但编译器不接受
<R super T, S extends R> List<R> mix ...
被编译器拒绝,因为下限通配符不能存储在命名变量中(仅在表达式中使用)? super X
我可以将参数移动到类本身,例如,但类型信息实际上在实例级别上没有业务,因为它仅用于一个方法调用,并且每次想要在不同的参数上调用方法时,都必须重新转换对象。List2<R, T extends R, S extends R>
据我所知,没有办法用泛型来做到这一点。我能做的最好的事情就是返回一个原始数据并将其投射到调用站点,就像在引入泛型之前一样。有没有人有更好的解决方案?List2