Java:如何创建一个只能接受作为接口的对象的函数?

时间:2009-11-19 13:13:36

标签: java interface

我需要编写一个接受对象的函数,但是我想在函数调用中强制执行(不是在调用函数之后)该对象是一个接口。

意思是,我想确保在编译时这是一个接口,而不是在运行时。

我的意思是什么?

interface ISomething {...} 
class A implements ISomething { ... }
ISomething something = new A(); 
MyClass.register(something);

在这个例子中,传递的对象是一个接口,我希望MyClass.register函数在它的声明中强制执行这个要求。

我不知道我将获得哪个接口,并且没有定义另一个接口要由所有其他实现实现,因为我需要真正的接口。

7 个答案:

答案 0 :(得分:10)

要仅接受实现接口作为参数的对象,请使用接口作为类型,即:

void acceptMaps(Map argument) {
}
可以使用实现Map接口的对象来调用

,例如HashMap但不能使用String,因为它们没有实现Map

这是你对你的问题的意思吗?

在此示例中,

编辑,也会接受实现SortedMap扩展Map的对象,因此在您的情况下,您可以创建BaseInterface并将其扩展为您希望AcceptedInterface extends BaseInterface方法接受的接口(如.register(BaseInterface arg))。

答案 1 :(得分:5)

您无法实例化接口,因此您永远无法创建一个接口。您可以在函数的参数中指定接口,并且只能传入实现该接口的对象。但是没有要求接口的方法是传入的,因为你无法创建它们。

我认为你需要重新思考你想要完​​成的事情。

答案 2 :(得分:4)

您要区分对象的类型(在本例中为A)和对象的引用类型(在本例中为ISomething)。

听起来你想要允许这段代码:

ISomething something = new A(); 
MyClass.register(something);

但禁止此代码:

A something = new A(); 
MyClass.register(something);

我认为你不能用Java实现这一点。

答案 3 :(得分:1)

让我看看我是否理解。

您是否希望在编译时检查传递给函数的参数是否为某个接口?任何界面?

如果这是问题,答案是你不能。

  

我不知道我会得到哪个界面[...]我需要真正的界面。

如果您不知道期望哪种类型,则无法实际验证。

在Java中你需要知道验证参数的类型,参数必须是相同的类型或后代, Java在编译时没有对这方面做出区分,你可以在运行时使用它如Daff所示。

答案 4 :(得分:0)

您可以在运行时询问您获取接口的对象的类。 如果您还不能给编译器提供您期望的接口类型,那么它无法预测将传递给您的方法的内容,因此您将不得不使用运行时反射。

答案 5 :(得分:0)

没有办法在运行时检查,如果'对象是一个接口',因为一个对象永远不会是'一个接口',它只是一个实现接口的类的实例。

并且不可能将方法签名限制为接口使用,比如你允许输入'Animal'类型但不输入实现动物行为的'Dog'。 (我猜这就是你要找的东西)

举个例子 - 你想要这个实现的编译器错误:

interface ISomething {...} 
class A implements ISomething { ... }
ISomething something = new A(); 
MyClass.register(something);

A unwanted = (A) something;
MyClass.register(unwanted); // <- compilation error here

但实际上说 - 我认为没有直接原因。如果您想强制程序员使用接口 - 用户代码检查或质量检查工具。如果要限制实现的实例化,请保护构造函数并使用工厂生成实例。

答案 6 :(得分:0)

“对象是一个接口”没有意义。看起来你想要强制传递给函数的指针是用

这样的接口类型声明的
Interface_t x = new Class_which_implements_interface_t();

而不是

Class_which_implements_interface_t y = new Class_which_imlements_interface_t();

唯一的问题是如果你制作这样的函数:

void some_func(Interface_t z) {...}

你用some_func(x);some_func(y);调用它的函数是按值传递引用,这意味着在some_func内,z是x或y的副本转换为Interface_t指针。无法获取有关原始指针的类型的信息。只要它能够被转换为Interface_t,它就会编译并运行。