只接受部分类的通用方法

时间:2012-12-21 12:44:49

标签: java generics inheritance

假设我有以下类结构:

class Base {}
class A extends Base {}
class B extends Base {}
class C extends Base {}

我想编写方法,接受 A B 的实例,但不接受 C 的实例。
我可以用Java实现吗?

我知道这不是很好的继承情况( A B 应该有与 C 不同的共同父级),但我只是很好奇用Java方式来处理这样的情况。

修改

我知道更好的继承会解决问题。我只是好奇,如果Java有一些标准的机制来解决这样的问题。
!!!

9 个答案:

答案 0 :(得分:43)

使用interface并且只有AB来实现它。

答案 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)

如果某些内容应该接受AB但不接受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

         }
}