是否使用仿制药?

时间:2014-03-10 06:15:40

标签: java generics

我有以下类的层次结构

public abstract class MyAbstractClass {

}

public abstract class AbstractClassA extends MyAbstractClass {

}
public class AbstractClassB extends MyAbstractClass {

}
public class ClassA extends AbstractClassA {

}
public class ClassB extends AbstractClassA {

}

我有一个转换器,它应该接受class扩展AbstractClassA的实例,并且应该返回instance扩展class的{​​{1}}。我有两个版本的转换类1使用Generic而另一个不是。两个都是鳍。但是,指定转换器签名的正确方法是什么?

AbstractClassB

4 个答案:

答案 0 :(得分:1)

只在编译时检查泛型,并在编译期间用适当的类型替换。

ConverterTwo代码将在编译期间转换为ConverterOne种代码,因此两者都是等效的。

当你编写一个 API 时,泛型特别有用,你不知道API的消费者会传递什么样的对象。 在您的情况下,如果您打算编写通用适配器。

genrics的典型示例:Collection Interface和实现它的类。

答案 1 :(得分:0)

使用1,您需要进行所有类型检查,因为参数扩展了抽象类。它的代码少于2,这总是一件好事。但两者都不会错误

答案 2 :(得分:0)

两者都是正确的方法。与ConverterTwo相比,ConverterOne类的签名代码更少。此外,语法AbstractClassA<A extends AbstractClassA>在此示例中的行为方式也相同。

答案 3 :(得分:0)

两者都是正确的,但我的建议是ConverterTwo,这更简单。您可以随时在转换器中生成Generify并生成通用接口或Abstract类。