Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以未知类型作为返回类型实现通用Java接口_Java_Generics - Fatal编程技术网

以未知类型作为返回类型实现通用Java接口

以未知类型作为返回类型实现通用Java接口,java,generics,Java,Generics,我使用的Java接口定义如下: interface Whatever<T> { T aMethod(); } 我想为编译时未知的类型实现它,例如,在运行时通过反射确定。这是可能的,因为泛型类型在编译时被丢弃,所以它们显然是不需要的。但是,语法要求为T指定要替换的内容,否则程序将无法编译 我应该替换什么类型的T?一种解决方案是替换对象: lambda会自动推断类型,在本例中,这是完全正确的,因为类型在内部并不重要,编译器可能会将T推断为对象或在lambda主体中返回的对象的类

我使用的Java接口定义如下:

interface Whatever<T> {
    T aMethod();
}
我想为编译时未知的类型实现它,例如,在运行时通过反射确定。这是可能的,因为泛型类型在编译时被丢弃,所以它们显然是不需要的。但是,语法要求为T指定要替换的内容,否则程序将无法编译


我应该替换什么类型的T?

一种解决方案是替换对象:

lambda会自动推断类型,在本例中,这是完全正确的,因为类型在内部并不重要,编译器可能会将T推断为对象或在lambda主体中返回的对象的类型

我想为编译时未知的类型实现它,例如,在运行时通过反射决定

泛型纯粹是一个编译时概念。如果您不想或不需要在编译时知道类型,请不要使用泛型:

接口无论什么{ 物体法; } 这样更容易使用:

Whatever=->{[statements]};
这不再是一个原始类型,因为它不是通用的

当我写问题时,我想到了两个解决方案,我发布了这两个解决方案。欢迎使用任何其他解决方案或注意事项。不要在java中使用匈牙利符号。i、 e.不要从i开始你的接口。这是一种可怕的编码方法,大多数行业已经不再采用这种方法,java社区非常不喜欢这种方法。@SoftwareEngineer匈牙利符号是我正在从事的项目选择的惯例,这就引出了这个问题。我改变它是为了它,但是我不认为它与这个问题有多大关系。我从来都是一个原始类型。不要使用原始类型。使用IWhatever.@AndyTurner输入错误。更正。我不控制界面。我稍微改变了原始问题的措辞,使其更加明显。顺便说一句,界面减去更改后的名称,当然是一家大型科技公司的一个大型项目的一部分。
Whatever<?> whatever = new Whatever<Object>() {
    public Object aMethod() { [statements] }
};
Whatever<?> whatever = () -> { [statements] };