3

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

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

Animal a = new Dog();

动态类型必须继承静态类型的地方:

public class Dog extends Animal {...}

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

所以Dog必须扩展Animal-class 并实现接口?

我会想象这样的事情:

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
}
4

2 回答 2

5

不,这是不可能的。您可以考虑一些解决方法,例如:

abstract class HappyAnimal extends Animal implements Happy

然后使用该类型。当然,您的类必须扩展,如果它们直接扩展和实现HappyAnimal,它将不起作用。AnimalHappy

于 2012-05-31T18:48:09.710 回答
3

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

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

...

A a = new Dog();

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

于 2012-05-31T18:50:12.927 回答