微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以为通用函数提供正确的类型信息吗?

如何解决我可以为通用函数提供正确的类型信息吗?

我有一堆类属性,它们以某种复杂但非常统一的方式进行初始化。由于维护此代码的大约10个副本既容易出错,也很麻烦,因此我想对此进行抽象。

这是设置一个属性代码

if ( userConfigMapPath != null ) {
    final TypeReference<UserConfig> ref =
            new TypeReference<UserConfig>() {
            };
    this.userConfig = Optional.of(
            new GenericConfigMap<>( userConfigMapPath,(int) REFRESH_RATE.getSeconds(),objectMapper,ref ) );
} else {
    this.userConfig = Optional.empty();
}

对每个属性重复此操作,但属性名称在这种情况下为userConfig,路径(userConfigMapPath)和类型(userConfigMap)不同。

所以我尝试将其抽象为方法

    private <T> Optional<GenericConfigMap<T>> optionalGenericConfigMapFromPath( final ObjectMapper objectMapper,final String path ) {
        Optional<GenericConfigMap<T>> result;
        if ( path != null ) {
            final TypeReference<T> ref =
                    new TypeReference<T>( ) {
                    };
            result = Optional.of(
                    new GenericConfigMap<>( path,(int) REFRESH_RATE.getSeconds( ),ref ) );
        } else {
            result = Optional.empty( );
        }
        return result;
    }

请注意,由于每个属性的类型不同,因此此函数是通用的。我使用这种方法来设置每个属性

this.userConfig = optionalGenericConfigMapFromPath(objectMapper,userConfigMapPath);
this.networkConfig = optionalGenericConfigMapFromPath(objectMapper,networkConfigMapPath);
this.dodadConfig = optionalGenericConfigMapFromPath(objectMapper,dodadConfigMapPath);

现在,此编译,但是它存在一些严重的运行时问题。问题的症结在于,在上述任何一种情况下,编译器似乎都无法确定T是什么。似乎基于对象映射器的认值而不是属性的类型来选择T。而且由于对象映射器是从json读取的,因此它是LinkedHashMap而不是我们想要的任何类型。

现在,这不会引起编译错误,这让我感到困惑,但是每当我们尝试使用其中一个属性方法时,都会产生异常,从而导致运行时类型错误(无法转换{{1} }转换为实际类型。

我想要的是编译器在编译时实际知道函数的每次调用LinkedHashMap类型。实际上,如果可以的话,我很高兴告诉它T的类型。使用@JeroenSteenbeeke帮助我的语法

T

这种类型的信息似乎刚刚被忽略了,因为当我运行调试器时,它的行为仍与之完全相同。因此,我尝试使用this.userConfig = this.<UserConfig> optionalGenericConfigMapFromPath(objectMapper,userConfigMapPath); this.networkConfig = this.<NetworkConfig> optionalGenericConfigMapFromPath(objectMapper,networkConfigMapPath); this.doodadConfig = this.<DoodadConfig> optionalGenericConfigMapFromPath(objectMapper,doodadConfigMapPath); 作为代理来进行一些依赖于垃圾的键入:

Class
    private <T> Optional<GenericConfigMap<T>> optionalGenericConfigMapFromPath( final Class<T>,final ObjectMapper objectMapper,ref ) );
        } else {
            result = Optional.empty( );
        }
        return result;
    }

这基本上是依赖函数类型:

Dependent type

编译器还将忽略此示例中给出的类型信息,并继续生成与以前相同的类型错误的程序。

我真的很乐于此。 有什么方法可以使编译器识别此类型信息并创建正确类型的值?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。