Java语法:公共类Me扩展了东西<;字符串、整数、字符>;
免责声明:我不熟悉Java泛型和集合 背景:我已经学习了Java泛型和语法的基础知识。现在,我试图了解它们是如何应用于Hadoop的(Java语法:公共类Me扩展了东西<;字符串、整数、字符>;,java,generics,inheritance,Java,Generics,Inheritance,免责声明:我不熟悉Java泛型和集合 背景:我已经学习了Java泛型和语法的基础知识。现在,我试图了解它们是如何应用于Hadoop的(公共静态类TokenizerMapper Extendes Mapper) 问题:直到今天,我在类定义中只看到了占位符(公共类OrderedPair实现了Pair),而不是具体的类(公共类Me扩展了东西) 问题:一般来说,如果我有这个 public class Me扩展了Thing …什么是“扩展事物”?看起来我在“扩展”东西——也就是说,Me子类继承了东西超类的
公共静态类TokenizerMapper Extendes Mapper
)
问题:直到今天,我在类定义中只看到了占位符(公共类OrderedPair实现了Pair
),而不是具体的类(公共类Me扩展了东西
)
问题:一般来说,如果我有这个
public class Me扩展了Thing
…什么是“扩展事物”
?看起来我在“扩展”东西——也就是说,Me子类继承了东西超类的方法。这种继承与东西
不同吗
澄清:换句话说,不使用泛型(例如,
公共类X扩展Y
)和泛型(公共类X扩展Y
)扩展类之间有什么区别 扩展具有泛型类型的类时,可以选择指定子类将在其下工作的类型。例如,类MyList扩展了ArrayList
将具有ArrayList
方法,但特定于字符串
同样,在扩展映射器时,需要指定映射器将处理的参数类型。您可以通过提供类型参数
Mapper
declares来实现这一点。泛型类可以有不同的使用类型(您可以在实例化它的对象时选择要使用的类型)。如果您扩展一个泛型类并在其中放置具体类型,就像您在这里做的那样:public class Me extends Thing
,这意味着Me正在扩展Thing,但Thing不再是泛型的,因为它现在绑定到给定的类型
在此之前,您可以实例化以下内容:
Thing<String, Character, Integer> myThing = new Thing<>();
您还可以使用实际的泛型类型来扩展它,这样您的Me类仍然是泛型的
public class <T, K, V> Me extends Thing<T, K, V>
...
// init with
Me<String, Character, Integer> myMe = new Me<>();
公共类Me扩展东西
...
//初始化
Me myMe=新的我();
有了它,你可以在任何地方用给定的泛型类型初始化我,这将传递给泛型对象
你也可以做一部分。所以有些类型的东西是固定的,有些可以在你实例化我的时候自由选择
public class <T> Me extends Thing<String, T, String>
...
// init with
Me<String> myMe = new Me<>();
公共类Me扩展东西
...
//初始化
Me myMe=新的我();
如果超类型使用泛型,那么,与任何泛型类型一样,在没有泛型参数的情况下引用它是使用原始类型的严重错误。对于泛型类型中的每个类型变量,必须使用泛型类型变量或具体类型。例如,一个变量如下
Thing<String, Integer, Character> thing = new Thing<>();
Thing Thing=新事物();
当然,这与
Thing<String, String, String> thing = ...
Thing=。。。
因为它处理不同的类型
继承也是如此。在本例中,您将类型参数锁定为具体类型
public class SomeThing extends Thing<String, Integer, Character> { ...
公共类某物扩展了某物{。。。
锁定SomeThing
可以处理的类型,以便SomeThing
实际上不是泛型类
澄清:换句话说,两者之间的区别是什么
扩展没有泛型的类(例如,公共类X扩展了Y)
还有泛型(公共类X扩展了Y
)
不同之处在于,在第二种情况(泛型类)中,如果要编译良好,则必须遵守泛型类指定的类型约束,否则应声明原始子类。通常,泛型类指定的类型由泛型类的方法使用。
因此正确定义它们很重要。
您主要有3个案例。
采用此泛型类声明,该声明指定3个参数,并在
myMethod()
方法中使用它们:
public class Y <A extends AClass,B extends BClass, C extends CClass> {
public void myMethod(A a, B b, C c){
...
}
}
在这种情况下,它编译得很好,但有警告。您将失去泛型方法调用的好处。 编译器将考虑代码“>>Z/COD>”的签名:
public void myMethod(Object a, Object b, Object c){
...
}
public void myMethod(ASubClass a, BSubClass b, CSubClass c){
...
}
2) 您的子类是一个通用的兼容子类:
public class Z extends Y<ASubClass,BSubClass,CSubClass> {
....
}
3) 您的子类是泛型类,但不符合父类指定的参数,因此存在编译错误
public class Z extends Y<BSubClass,ASubClass,CSubClass> {
....
}
公共类Z扩展了Y{
....
}
如果使用泛型进行扩展,则必须使用泛型Mapper
声明类型参数来实现方法。子类型传递类型参数。它是普通泛型。除了指定超类型应使用的类型的子类型之外,继承没有区别。举个例子,Mapper
声明map(KEYIN-key,VALUEIN-value,Context-Context)
。这意味着Me-extends-Mapper
将需要实现一个方法map(String-key,Integer-value,Context-Context)
Me-extends-Mapper
将需要实现map(String-key,String-value,Context-Context)
。
public void myMethod(ASubClass a, BSubClass b, CSubClass c){
...
}
public class Z extends Y<BSubClass,ASubClass,CSubClass> {
....
}