Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java语法:公共类Me扩展了东西<;字符串、整数、字符>;_Java_Generics_Inheritance - Fatal编程技术网

Java语法:公共类Me扩展了东西<;字符串、整数、字符>;

Java语法:公共类Me扩展了东西<;字符串、整数、字符>;,java,generics,inheritance,Java,Generics,Inheritance,免责声明:我不熟悉Java泛型和集合 背景:我已经学习了Java泛型和语法的基础知识。现在,我试图了解它们是如何应用于Hadoop的(公共静态类TokenizerMapper Extendes Mapper) 问题:直到今天,我在类定义中只看到了占位符(公共类OrderedPair实现了Pair),而不是具体的类(公共类Me扩展了东西) 问题:一般来说,如果我有这个 public class Me扩展了Thing …什么是“扩展事物”?看起来我在“扩展”东西——也就是说,Me子类继承了东西超类的

免责声明:我不熟悉Java泛型和集合

背景:我已经学习了Java泛型和语法的基础知识。现在,我试图了解它们是如何应用于Hadoop的(
公共静态类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> {
       ....
}