我目前有一个类测试,它将流转换为相同类型的流。
class Test {
private Function<A1, A1> a1Transform;
private Function<A2, A2> a2Transform;
public <T extends A> Stream<T> transform(Stream<T> input) {
return input
.filter(o -> o instanceof A1)
.map(A1.class::cast)
.map(a1Transform);
}
}
除非
,否则代码无法编译Stream<? super T>
或.map(o -> (T) o)
将其投回T. 任何一种解决方案都是好的。什么是解决这个问题的更好方法。
答案 0 :(得分:1)
如果A1
,A2
等具有共同的超类型A
,那么您可以将方法更改为以下内容:
public Stream<A> transform(Stream<?> input) {
return input.filter(o -> o instanceof A1)
.map(o -> (A1) o)
.map(a1Transform)
.map(o -> (A) o);
}
方法无法返回,例如, Stream<A1>
,或 Stream<A2>
,或 Stream<A3>
等。您可以做的最好的事情就像上面那样,您返回Stream<A>
,或者您可以返回Stream<? extends A>
。
如果返回具有确切类型元素的流非常重要,那么您可以使用类似访问者模式的内容,并将访问者传递给方法,而不是直接返回流。
另一种可能的方法是让调用者将Class
传递给方法:
public <T extends A> Stream<T> transform(Stream<?> input, Class<T> type) {
return input...
...
...
.map(type::cast);
}
但是,遇到这种问题通常表明你需要重新设计一些东西。通常,在面向对象的设计中,API外部的代码不应该关注具有特定类型的对象。