代码之家  ›  专栏  ›  技术社区  ›  mellow-yellow

Java语法:公共类Me扩展了Thing<String,Integer,Character>

  •  0
  • mellow-yellow  · 技术社区  · 7 年前

    免责声明

    :我学习了Java泛型的基础知识 here here Mapper ( public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> )

    :直到今天,我只看到 public class OrderedPair<K,V> implements Pair<K,V> ),而非具体类别( public class Me extends Thing<String,Integer,Character>

    问题 :所以一般来说,如果我有这个。。。

    公共类Me扩展了事物<字符串、整数、字符>

    …什么是“延伸” Thing<String,Integer,Character> 意思是?我似乎在“扩展”事物——也就是说,Me子类继承了事物超类的方法。这种继承与 Thing<String,String,String> ?

    澄清 public class X extends Y )和泛型( public class X extends Y<a,b,c>

    4 回复  |  直到 7 年前
        1
  •  1
  •   A1m    7 年前

    泛型类可以具有与之一起使用的不同类型(当实例化泛型类的对象时,可以选择与之一起使用的类型)。如果您扩展了泛型类并在其中放置了具体类型,就像您在这里所做的那样: public class Me extends Thing<String,Integer,Character>

    之前你可以这样实例化:

    Thing<String, Character, Integer> myThing = new Thing<>();
    

    但是我现在被束缚了,你不能再为它选择类型了。

    Me myMe = new Me();
    

    public class <T, K, V> Me extends Thing<T, K, V>
    ...
    // init with
    Me<String, Character, Integer> myMe = new Me<>();
    

    有了它,你可以用给定的泛型类型在任何地方初始化我,这将传递给泛型。

    public class <T> Me extends Thing<String, T, String>
    ...
    // init with
    Me<String> myMe = new Me<>();
    
        2
  •  0
  •   Kraylog    7 年前

    扩展具有泛型类型的类时,可以选择指定子类将在其下工作的类型。例如 class MyList extends ArrayList<String> 将拥有 ArrayList

    以同样的方式,当您扩展 Mapper ,您需要指定映射器将处理的参数类型。您可以通过提供类型参数来实现这一点 映射器

        3
  •  0
  •   davidxxx    7 年前

    扩展没有泛型的类(例如,公共类X扩展Y) 和泛型( public class X extends Y<a,b,c>

    不同之处在于,在第二种情况(泛型类)中,如果要进行精细编译,则必须遵守泛型类指定的类型的约束,否则应该声明一个原始子类。
    通常,泛型类指定的类型由泛型类的方法使用。
    因此,正确定义它们很重要。

    采用此泛型类声明,该声明指定了3个参数,并在 myMethod() 方法:

    public class Y <A extends AClass,B extends BClass, C extends CClass> {
        public void myMethod(A a, B b, C c){
             ...
        }
    }
    

    1) 您的子类是一个原始类:

    public class Z extends Y {
           ....
    }
    


    您失去了泛型方法调用的好处。 编译器将考虑以下方法: Z

    public void myMethod(Object a, Object b, Object c){
         ...
    }
    

    2) You子类是一个通用的兼容子类:

    public class Z extends Y<ASubClass,BSubClass,CSubClass> {
           ....
    }
    

    编译器将考虑以下方法: 签字:

    public void myMethod(ASubClass a, BSubClass b, CSubClass c){
         ...
    }
    

    3) 您的子类是泛型类,但不符合父类指定的参数,您有编译错误。

    public class Z extends Y<BSubClass,ASubClass,CSubClass> {
           ....
    }
    
        4
  •  -1
  •   Lew Bloch    7 年前

    如果超类型使用泛型,那么,对于任何泛型类型,在没有泛型参数的情况下引用它是使用 原始类型 。您必须使用泛型 类型变量 或泛型类型中每个类型变量的具体类型。例如,变量如下

    Thing<String, Integer, Character> thing = new Thing<>();
    

    Thing<String, String, String> thing = ...
    

    因为它处理不同的类型!

    同样的道理也适用于继承。在本例中,您将类型参数锁定为具体类型。

    public class SomeThing extends Thing<String, Integer, Character> { ...
    

    锁定以下类型: SomeThing