为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不能从泛型参数访问属性?

为什么我不能从泛型参数访问属性?

鸿蒙传说 2021-11-03 16:07:42
主类import java.io.File;import java.io.IOException;import java.awt.Font;import java.awt.FontFormatException;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.GraphicsEnvironment;import javax.swing.JFrame;import javax.swing.JPanel;public class MainClass extends JPanel{   static final int WINDOW_WIDTH = 1600;   static final int WINDOW_HEIGHT = 900;   // Displays the game window.   private static void displayGameWindow() {      JFrame frame = new JFrame("Bandit King");      frame.getContentPane().add(new MainClass());      frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);      frame.setVisible(true);      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   }   // Imports a font.   private static void registerFont() {      try {         GraphicsEnvironment ge =                GraphicsEnvironment.getLocalGraphicsEnvironment();         Font f = Font.createFont(Font.TRUETYPE_FONT, new File("OLDSH.TTF"));         ge.registerFont(f);      } catch (IOException|FontFormatException e) {         e.printStackTrace();         System.out.println("ERROR loading font, switching to serif.");         Font f = new Font("Serif", Font.PLAIN, 12);      }   }   // Calls functions to display the screen   @Override   public void paint(Graphics g) {      Dimension d = this.getPreferredSize();      Graphics2D g2d = (Graphics2D) g;      // default font settings      String fontName = "OldStyle 1 HPLS";      String fontType = "PLAIN";      int[] color = {0, 0, 0};      int fontSize = 25;      // display game title      String title = "Bandit King";      int titleCentered = DisplayText.findCenter(g2d, title);      DisplayText.displayText(g2d,             title, fontName, "BOLD",             color,             titleCentered, 50, 40);      }   }
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

因为你行public class Portfolio<Asset>-在这里Asset(同为常用的TU等等)只是普通的声明,并没有涉及到你的类Asset

只需<Asset>Portfolio类声明中删除。

您可以在此处找到有关 Java 泛型的更多信息:

java泛型

但是这本教科书涵盖了全面的信息:

Java 泛型常见问题解答


要实现您想要的功能,您需要将代码更改为:

Portfolio<T extends Asset>

和:

public void buy(T asset)


查看完整回答
反对 回复 2021-11-03
?
米脂

TA贡献1836条经验 获得超3个赞

该Assert通用型不设置任何势必Portfolio:


public class Portfolio<Asset> {}

就像你已经声明:


public class Portfolio<Asset extends Object> {}

所以泛型类型Asset有界Object并且Object没有任何title字段。


你想要的是:


public class Portfolio<A extends Asset> {


    private Map<String, A> deposit = new HashMap<>();


    public void buy(A a) {

        deposit.put(a.title, a);

    }


    public A get(String title) {

        return deposit.get(title);

    }


}

您必须在泛型类声明中声明上限通配符,而您仅在声明具有泛型类类型的变量时才指定具体类型:


Portfolio<Share> p = new Portfolio<>();


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 225 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信