当前位置: 首页 > 知识库问答 >
问题:

如何将泛型类类型转换为特定类型?

郑承恩
2023-03-14

我正在尝试有一个通量通用转换器使用通用类型在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 typeArgumentClass) 创建一个类型为 的类FluxandMonogeneric,并返回一个方法Public Flux createFluxConverter(String[]data) 。我想在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();
    }
}

共有1个答案

董哲
2023-03-14
    public <T> Flux<T> createFluxConverterStringToInt(String[] data, Function<String, T> mapper) {
        return Flux
                .just(data)
                .map(mapper)
                .log();
    }

然后,不是传入您想要的输出类型,而是传入您想要将数据转换为正确的输出类型的映射器。

例如。Integer::ParseIntString::Trim或其他任何东西。

 类似资料:
  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 我正在修改open JDK以添加特性,我已经遇到了两次,但没有好的解决方案。

  • 我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类 这些类在方法中用作返回类型。为此,我创建了这个helper类: 正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返

  • 在下面来自的语法中,泛型类型参数在实例化原始类型数组后用于类型转换,

  • 我有一个类似于Pairs的类。我有一个特性,可以将这个类转换成Json格式。 当我使用这个特性时,我得到了以下错误,即对于

  • 我有一个类型 现在我想做这样的事情。 如何将我的 转换为基元类型? 它给我的错误是: 将“Rating”类型转换为“number”类型可能是错误的,因为这两种类型都没有充分重叠。如果这是有意的,首先将表达式转换为“未知” 我已经经历过了,但我想要的是它的反面 编辑: tsconfig.json tsc版本:3.2.1