我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器string
->integer
:
public Flux<Integer> createFluxConverterStringToInt(String[] data) {
Flux<Integer> stringFlux = Flux
.just(data)
.map(value -> Integer.parseInt(value))
.log();
return stringFlux;
}
类型转换器string
->转换为我想要的任何类型。因此,我正在使用构造函数FluxandMonogeneric(class
创建一个类型为
的类FluxandMonogeneric
,并返回一个方法Public Flux
。我想在map
调用上创建类似这样的多个条目:this.typeargumentclass.isinstance(integer.class)
,但类类型不同。但它甚至对整数也不起作用。
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Slf4j
public class FluxAndMonoGeneric<OUT> {
private final Class<OUT> typeArgumentClass;
public FluxAndMonoGeneric(Class<OUT> typeArgumentClass) {
this.typeArgumentClass = typeArgumentClass;
}
public Flux<OUT> createFluxConverter(String[] data) {
Flux<OUT> stringFlux = Flux
.just(data)
.map(value -> {
// NEVER ENTERS ON THIS IF
if (this.typeArgumentClass.isInstance(Integer.class))
return this.typeArgumentClass.cast(Integer.parseInt(value));
// ALWAYS ENTERS ON THIS ELSE AND STRING CANNOT BE CASTED TO INTEGER
else return this.typeArgumentClass.cast(value);
})
.log();
return stringFlux;
}
public Mono<OUT> createMonoConverter(String data) {
Mono<OUT> integerMono = Mono.just(data)
.map(value -> this.typeArgumentClass.cast(value))
.log();
return integerMono;
}
}
当我使用此单元测试进行测试时,我得到错误:java.lang.ClassCastException:无法将java.lang.String转换为java.lang.Integer
。
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Flux;
import reactor.test.StepVerifier;
public class FluxAndMonoGenericTest {
// this works.
@Test
void testCreateGenericFluxWithString() {
String expect = "Spring,Spring Boot,Reactive Spring";
String delimiter = ",";
String[] messages = expect.split(delimiter);
FluxAndMonoGeneric<String> myFluxGenericTest = new FluxAndMonoGeneric<String>(String.class);
Flux<String> stringFlux = myFluxGenericTest.createFluxConverter(messages);
StepVerifier.create(stringFlux)
.expectNext(messages[0])
.expectNext(messages[1])
.expectNext(messages[2])
.verifyComplete();
}
// THIS DOES NOT WORK
@Test
void testCreateGenericFluxWithInteger() {
String expect = "1,1234,7654,34";
String delimiter = ",";
String[] messages = expect.split(delimiter);
Integer[] expectedMessages = new Integer[]{1, 1234, 7654, 34};
FluxAndMonoGeneric<Integer> myFluxGenericTest = new FluxAndMonoGeneric<Integer>(Integer.class);
Flux<Integer> stringFlux = myFluxGenericTest.createFluxConverter(messages);
StepVerifier.create(stringFlux)
.expectNext(expectedMessages[0])
.expectNext(expectedMessages[1])
.expectNext(expectedMessages[2])
.expectNext(expectedMessages[3])
.verifyComplete();
}
}
public <T> Flux<T> createFluxConverterStringToInt(String[] data, Function<String, T> mapper) {
return Flux
.just(data)
.map(mapper)
.log();
}
然后,不是传入您想要的输出类型,而是传入您想要将数据转换为正确的输出类型的映射器。
例如。Integer::ParseInt
或String::Trim
或其他任何东西。
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
我正在修改open JDK以添加特性,我已经遇到了两次,但没有好的解决方案。
我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类 这些类在方法中用作返回类型。为此,我创建了这个helper类: 正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返
在下面来自的语法中,泛型类型参数在实例化原始类型数组后用于类型转换,
我有一个类似于Pairs的类。我有一个特性,可以将这个类转换成Json格式。 当我使用这个特性时,我得到了以下错误,即对于
我有一个类型 现在我想做这样的事情。 如何将我的 转换为基元类型? 它给我的错误是: 将“Rating”类型转换为“number”类型可能是错误的,因为这两种类型都没有充分重叠。如果这是有意的,首先将表达式转换为“未知” 我已经经历过了,但我想要的是它的反面 编辑: tsconfig.json tsc版本:3.2.1