2017-07-06 76 views
1

我有以下的类和接口的Java:变量需要类和接口

interface R 
class A extends Component implements R 
class B extends JButton implements R 
class C extends JPanel implements R 
class D extends xyz (that extends Component) implements R 

所以我有几类,所有扩展某种成分的(或多或少直接),并且都实现R.

于是我有了一个需要这样的工作变量和方法不同等级F:

public class F { 

    public TYPE myVariable; 

    public myMethod void (TYPE argument) { 
    //...code... 
    myVariable = argument; 
    actionThatRequiresComponent(argument); 
    argument.actionDefinedInR(); 
    //...code... 
    } 

    public anotherMethod void() { 
    //...code... 
    myMethod(myVariable); 
    //...code... 
    } 
} 

的问题是,这种类型必须满足两个质量要求:它是T o是任何类型的组件,并且必须实现接口R.因此该变量具有相同的要求。

我不确定采取哪种方法?我应该做一些扩展Component的抽象类,实现R?我应该跳过接口R的需求,并试着用try catch吗?我可以使用泛型类吗?当涉及到变量时,我该怎么做? 有什么建议吗?

+2

您是否尝试过声明的泛型类型'T'的''? – khelwood

+0

我不明白。 –

+0

“action”定义来自哪里?它是“R”的一部分吗?如果是这样,是'R'通用接口? – RealSkeptic

回答

0

如果你想写一个接受必须扩展Component并实现R参数的方法,你可以做这样的:

public <T extends Component & R> void myMethod(T item) { 
    ... 
} 

那么你应该能够进入你的方法,其任何参数类型扩展/实现您指定的类型。

https://docs.oracle.com/javase/tutorial/java/generics/bounded.html

+0

感谢您的回答 - 至少它表明了我,我一直走在正确的道路上。这是我已经尝试过的。但首先,我被告知,“即时”定义类型是不好的编程(虽然我没有给出它是编程不好的原因),其次,我有一个问题,我不知道如何定义变量一样的方法。正如我上面写的,我也需要这种类型的变量。我不能写公开 myVariable = new C(); –

+0

为什么你需要声明一个这样的变量?你可以声明'C myVariable = new C();'如果'C'是它的具体类型。 – khelwood

+0

我需要存储用于调用该方法的变量。所以我有一个变量myVariable首先是空的。在我用任何类型的组件(实现R)调用myMethod之后,我会将该参数存储到myVariable。我也无法从类型对象中创建myVariable,因为该变量可能会再次用于该方法。 –