假设我有以下类结构:
class Base {}
class A extends Base {}
class B extends Base {}
class C extends Base {}
我想编写方法,接受 A 和 B 的实例,但不接受 C 的实例。
我可以用Java实现吗?
我知道这不是很好的继承情况( A 和 B 应该有与 C 不同的共同父级),但我只是很好奇用Java方式来处理这样的情况。
修改
!
我知道更好的继承会解决问题。我只是好奇,如果Java有一些标准的机制来解决这样的问题。
!!!
答案 0 :(得分:43)
使用interface并且只有A
和B
来实现它。
答案 1 :(得分:13)
您可以使用界面吗? e.g。
class Base {}
interface MyGenericInterface {}
class A extends Base implements MyGenericInterface {}
class B extends Base implements MyGenericInterface {}
class C extends Base {}
这样,该方法可以接受MyGenericInterface的实现,并且由于A和B实现了接口但C没有实现,它将根据需要接受A和B但不接受C的实例。
答案 2 :(得分:8)
如果某些内容应该接受A
,B
但不接受C
,那么您应该重新考虑为什么C
首先从Base
继承。您可以添加额外的继承层:
---Base---
| |
--Sub-- C
| |
A B
然后,您可以允许您的方法只接受Sub
类型的对象。 Sub
甚至不需要做任何事情,从技术上讲,它们都是Base
。
更快的解决方案是脏if( arg.instanceof(C) )
,但......
答案 3 :(得分:8)
您可以在运行时使用异常处理它:
void genericMethod(Base arg_in)
{
if(arg_in instanceof C)
{
throw IllegalArgumentException("C class not accepted.");
}
...
...
}
答案 4 :(得分:8)
不应仅仅因为想要拥有这样的方法而更改类型层次结构。 但是你希望有这种方法的情况可能表明你应该考虑你的 型层次。
但是如果你确定你的类型设计得很好,那么这种方法呢:
public class T {
public void doSomething(final A a) {
doSomthing(a);
}
public void doSomething(final B b) {
doSomthing(b);
}
private void doSomthing(final Base b) {
// Here is the implementation
}
}
答案 5 :(得分:3)
我想你的问题的答案是“不,java没有处理这种问题的标准方法”。如果你有这个问题,那么你可以在这里查看其他答案,比如修复继承或使用聪明的技术given by MrSmith42。
答案 6 :(得分:2)
您可以使用instanceof
检查对象是否属于某种类型。
当然,更好的想法是更好的继承结构。
答案 7 :(得分:2)
泛型是为了类型安全。期。不要“允许”或“禁止”任意事物。允许A和B而不是C,没有类型安全的原因。
答案 8 :(得分:0)
试试下面的代码片段
public <T extends Base> void setAuditorDetails(T model)
{
if(!(T instanceof C)){
// Your Business logic
}
}