可以在java中为变量分配不同的类型吗?

时间:2012-07-17 22:57:52

标签: java

我想知道Java中是否有可能有一个可能是不同类型的变量?具体来说,我有两个不同类的不同对象,它们都是表。所以我们说我们有:

TableTypeA t1;
TableTypeB t2;

假设两个类都有一个名为getSelectedRow()的方法,我是否可以创建第三个变量,以便我可以执行以下操作:

SomeType t3;
t3 = t1; 
t3.getSelectedRow();

t3 = t2;
t3.getSelectedRow();

TableTypeA和TableTypeB不扩展同一个类,它们最近的公共超类没有getSelectedRow()方法。看看它们的功能有多么相似,其中一个可能应该扩展另一个或者它们的类应该合并在一起,但是让我们说这样的结构变化不是一个选项,我建议可以做什么?

感谢。

编辑:我想我会为这些添加一个界面,非常感谢您的所有快速回复!

9 个答案:

答案 0 :(得分:3)

如果类实现了具有getSelectedRow()的接口,那么肯定。

在重新组织类层次结构的意义上,这种变化不是结构/组织的。

答案 1 :(得分:2)

如果TableTypeATableTypeB都实现了一个名为SomeType接口(而不是从基类派生),那么这是可能的。 E.g:

interface SomeType {
    Row getSelectedRow();
}

class TableTypeA implements SomeType {
    Row getSelectedRow() {
        // ...
    }
}

class TableTypeB implements SomeType {
    Row getSelectedRow() {
        // ...
    }
}

如果没有,那么不,你必须通过reflection

答案 2 :(得分:1)

可以使用界面:

public interface Table {
    Row getSelectedRow();
}

public class TableTypeA implements Table {
    Row getSelectedRow() {    // Must be defined

    }
}

public class TableTypeB implements Table {
    Row getSelectedRow() {    // Must be defined

    }
}

如果不更改类的体系结构,可以使用instanceof运算符和类型转换。

答案 3 :(得分:1)

  

...但是,让我们说这样的结构变化不是一种选择,我建议可以做什么?

如果不对所涉及的类型进行更改,则无法执行此操作。您可以期待的最好的方法是使用instanceof编写一些丑陋的代码并键入强制转换,并将其隐藏在方法中。反思是另一种选择,但这更加丑陋且更加昂贵(IMO)。

答案 4 :(得分:0)

没有通用接口或超类,不,不是直接的方式。编译器会抱怨分配并请求显式转换。显式转换将导致ClassCastException

另一种方法是使用反射。

答案 5 :(得分:0)

只有他们共享一个界面。这不像JavaScript。

答案 6 :(得分:0)

不,Java不支持duck typing

答案 7 :(得分:0)

如果您需要此行为并且您无法更改超类/实现接口,那么您所能做的就是创建包装类。

interface Table{ Row getSelectedRow(); }

class WrapperA extends TableTypeA implements Table{
  // copy all constructors and forward to super()
}

class WrapperB extends TableTypeB implements Table{
  // same
}

答案 8 :(得分:0)

如果您不控制原始课程,适配器可以派上用场 http://en.wikipedia.org/wiki/Adapter_pattern

public interface TableAdapter {
    Row getSelectedRow();
}

public class TableTypeAAdapter implements TableAdapter {
    private TableTypeA tableTypeA;
    public TableTypeAAdapter(TableTypeA tableTypeA) {
        this.tableTypeA = tableTypeA;
    }

    public Row getSelectedRow() {
        tableTypeA.getSelectedRow();
    }
}

TableTypeB的类似类

然后:

TableAdapter table = new TableTypeAAdapter(tableTypeA);
table.getSelectedRow();

table = new TableTypeBAdapter(tableTypeB);
table.getSelectedRow();