我需要编写一个接受对象的函数,但是我想在函数调用中强制执行(不是在调用函数之后)该对象是一个接口。
意思是,我想确保在编译时这是一个接口,而不是在运行时。
我的意思是什么?
interface ISomething {...}
class A implements ISomething { ... }
ISomething something = new A();
MyClass.register(something);
在这个例子中,传递的对象是一个接口,我希望MyClass.register函数在它的声明中强制执行这个要求。
我不知道我将获得哪个接口,并且没有定义另一个接口要由所有其他实现实现,因为我需要真正的接口。
答案 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
,它就会编译并运行。