我有以下类的层次结构
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
答案 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类。