假设我有一个类层次结构如下:
class Vehicle;
class Car extends Vehicle;
class Plane extends Vehicle;
Run Code Online (Sandbox Code Playgroud)
我有一个比较两个对象的函数
public <T extends Vehicle> generateDiff(T original, T copy)
Run Code Online (Sandbox Code Playgroud)
在编译时,上面的方法保证了两个对象Vehicle,但是它不能确保两个对象的类型是相同的.
generateDiff(new Car(), new Car()); //OK
generateDiff(new Plane(), new Plane()); //OK
generateDiff(new Car(), new Plane()); //WRONG
Run Code Online (Sandbox Code Playgroud)
我可以在编译时使用泛型来实现这个目的吗?
Ps:目前,我已实现它将抛出异常,如果Class两个对象不相同.但我对此并不满意.
提前致谢.
是的,你可以(有点)!
该型T被推断从参数,但你可以指定类型:
MyClass.<Car>generateDiff(new Car(), new Plane()); // generates a compile error
Run Code Online (Sandbox Code Playgroud)
如果没有键入方法,类型将T被推断为满足所使用边界的最窄类,因此对于参数Car和Plane最有效的类型Vehicle,所以这两行是等效的:
generateDiff(new Car(), new Plane()); // type is inferred as Vehicle
MyClass.<Vehicle>generateDiff(new Car(), new Plane());
Run Code Online (Sandbox Code Playgroud)
上面的代码假定它generateDiff()是一个静态方法.如果它是一个实例方法,您可以键入您的类并在您的方法中使用该类型.
一旦深入了解它,就会有点抽象.您还必须为该函数提供类类型(见下文).如果您想强制执行此类行为,我建议您编写单独的方法来接受您希望比较的类型.无论如何:
public <C extends Vehicle> void generateDiff(Class<C> type, C original, C copy);
Run Code Online (Sandbox Code Playgroud)
你可以这样使用它:
generateDiff(Plane.class, new Plane(), new Plane()); // OK
generateDiff(Car.class, new Car(), new Car()); // OK
generateDiff(Plane.class, new Plane(), new Car()); // ERROR
generateDiff(Vehicle.class, new Plane(), new Car()); // OK
Run Code Online (Sandbox Code Playgroud)
不知道为什么任何理智的人会想要这样做!:)