是否可以将变量分配给两种类型?

时间:2012-05-31 18:44:47

标签: java

出于好奇,是否可以将变量分配给两种类型?

由于我在这个问题上没有直接的技术术语,所以让我澄清一下。通常你会有一个静态和动态类型:

Animal a = new Dog();

动态类型必须继承静态类型:

public class Dog extends Animal {...}

但是可以确保动态类型扩展/实现多种类型吗?

那么Dog必须扩展Animal - 类并实现接口吗?

我想象的是:

Animal [implements Happy] a = new Dog();

我很确定这只是疯狂的谈话,但有可能吗?如果没有,最接近的替代方案是什么?

我认为只有在确保变量属于您自己创建的界面和无法编辑的类时才会有相关性。

我能想到的一种方法是每次使用它时通过强制运行来确定运行时:

try {
    @SuppressWarnings("unused")
    Animal a = (Happy) new Dog();
} catch (ClassCastException e) {
    //Is not of type Happy
}

//Using a method from the Happy-interface
try {
    ((Happy)a).smile();
} catch (ClassCastException e) {
    //Is not of type Happy
}

2 个答案:

答案 0 :(得分:5)

不,不可能直接。你可以想到一些解决方法,如:

abstract class HappyAnimal extends Animal implements Happy

然后使用该类型。当然,您的课程必须延长HappyAnimal,如果他们延长Animal并直接实施Happy,则无效。

答案 1 :(得分:3)

您可以通过在要检入的类或方法中声明类型参数来使用泛型:

<A extends Animal & Happy> //put in class/method declaration

...

A a = new Dog();

这将允许您在编译时进行类型检查,而无需使用任何其他abstract类。