只接受部分类的通用方法

Mic*_*man 19 java generics inheritance

假设我有以下类结构:

class Base {}
class A extends Base {}
class B extends Base {}
class C extends Base {}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nim*_*sky 43

使用界面,只有AB实现它.


Nic*_*ckJ 13

你可以使用界面吗?例如

class Base {}
interface MyGenericInterface {}
class A extends Base implements MyGenericInterface {}
class B extends Base implements MyGenericInterface {}
class C extends Base {}
Run Code Online (Sandbox Code Playgroud)

这样,该方法可以接受MyGenericInterface的实现,并且由于A和B实现接口但C不实现,它将根据需要接受A和B但不接受C的实例.


Jim*_*son 8

如果某些东西应该接受A,B但不是,C那么你应该重新考虑为什么C从一开始就继承Base.您可以添加额外的继承层:

   ---Base---
   |        |
--Sub--     C
|     |
A     B
Run Code Online (Sandbox Code Playgroud)

然后,您可以允许您的方法只接受类型的对象Sub.Sub甚至不需要做任何事情,从技术上讲,它们都是Base.

更快的解决方案是肮脏的if( arg.instanceof(C) )......


Azo*_*ous 8

您可以使用异常在运行时处理它:

void genericMethod(Base arg_in)
{
    if(arg_in instanceof C)
    {
        throw IllegalArgumentException("C class not accepted."); 
    }

    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)


MrS*_*h42 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

        }

    }
Run Code Online (Sandbox Code Playgroud)


Waq*_*yas 3

我想你的问题的答案是“不,java没有处理此类问题的标准方法”。如果您遇到这个问题,那么您可以在这里查看其他答案,例如修复继承或使用MrSmith42 给出的巧妙技术。

  • @MichałHerman 正确吗?17 - 1 ...天哪,这就像在工作一样。 (4认同)
  • 是的,我对我来说这个答案是正确的,因为我问Java是否有一些构建机制来处理此类问题。不是我自己如何处理此类问题,因为我已经知道了。 (3认同)