传递扩展父级的未知类,然后调用父级的函数(Java)

传递扩展父级的未知类,然后调用父级的函数(Java),java,function,parent,extends,Java,Function,Parent,Extends,我知道传递给函数的所有类都将扩展JComponent,但我不知道这些类本身是什么 我的代码是具体的,但我要求的是更一般的。 在我的代码中,我试图传递一个扩展JComponent的未知类,以便对该类调用setFont()的JComponent方法 我将此写为: public void setCustomFont(String ttfFile, Class<? extends JComponent> jc){ try { GraphicsEnviron

我知道传递给函数的所有类都将扩展JComponent,但我不知道这些类本身是什么

我的代码是具体的,但我要求的是更一般的。 在我的代码中,我试图传递一个扩展JComponent的未知类,以便对该类调用setFont()的JComponent方法

我将此写为:

    public void setCustomFont(String ttfFile, Class<? extends JComponent> jc){
      try {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(ttfFile)));
      } catch (IOException|FontFormatException e) { e.printStackTrace(); }
      jc.super.setFont(Font.TRUETYPE_FONT);
    }

public void setCustomFont(String ttfFile,Class您不需要将类传递给函数

只需传递对象本身:

public void setCustomFont(String ttfFile, JComponent jc){
    ...
    jc.setFont(Font.TRUETYPE_FONT);
}
setFont
方法不是类方法,而是实例方法,因此需要一个实现JComponent的实际对象来调用该方法


通过将参数定义为
JComponent jc
,该方法将只接受从JComponent扩展而来的对象,而不知道具体的类。

多态行为适用于对象层次结构。您传递的是与JComponent对象关联的类实例,该对象不知道JComponent方法。显然,您不能将JComponent类强制转换为JComponent对象。

这可能是我的无知,但您不应该传递
JComponent
的实例,而不是
class
?因此,在调用函数
setCustomFont()时
我会将扩展
JComponent
的类或
JComponent
实例传递给它,所以如果
Blah
扩展
JComponent
,我可以说
setCustomFont(“file.ttf”,Blah);
setCustomFont(“file.ttf”,Blah.super)
?不,不是类。要将字体设置为的实际对象。例如,如果您有“JLabel label1=new JLabel”(“一些文本”),您需要将“label1”传递给函数。谢谢!这非常有效。我想如果我在函数端将其称为
JComponent
,它将丢失其子位,只保留对象的
JComponent
部分。