java - 为什么我无法从通用参数访问属性?

标签 java generics

从我试图通过的测试用例开始:

@Test
void testGetShare() {
    // Given
    Portfolio<Share> p = new Portfolio<>();
    Share shareA = new Share("Share A");

    // When
    p.buy(shareA);

    // Then
    Assertions.assertEquals(shareA, p.get("Share A"));
}

我尝试将 Assets 对象存储在 Java HashMap 中,其中 Assets 提供 getTitle() 方法。但是,我似乎无法访问项目方法。

public class Portfolio<Asset> {

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

    // Unable to Access 'title'    
    public void buy(Asset a) {
        deposit.put(a.title, a);
    }

    public Asset get(String title) {
        return deposit.get(title);
    }

}

我有两种 Assets ,我希望能够将它们存入(参数化)存款。

public class Asset { public String title; }
public class Share extends Assets { public Share(String title) {super(title);} }
public class Commodity extends Assets { public Commodity(String title) {super(title);} }

为什么我无法访问 Assets 参数的标题?

最佳答案

因为你的线路public class Portfolio<Asset> - 这里Asset (与常用的 TU 等相同)只是通用声明,它与您的类 Asset 无关.

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

有关 Java 泛型的更多信息,您可以在这里找到:

java generics

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

Java Generics FAQ

<小时/>

要实现您想要的效果,您需要将代码更改为:

Portfolio<T extends Asset>

还有:

public void buy(T asset)

关于java - 为什么我无法从通用参数访问属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52691828/

相关文章:

java - 支付回调后 Spring security 'Expected CSRF token not found...'

c# - 根据参数过滤对象列表

c# - 为什么不能泛型代码中编写的操作需要显式参数声明

java - 99瓶啤酒的无限递归

java - 多线程执行@Handler方法

java - 由于以下问题无法启动服务器 : java. lang.NullPointerException

java - 在 Java 中最好没有工厂的情况下克隆通用对象的有效方法

arrays - Swift - 插入字符数组,功能解决方案

java - Java 有静态泛型参数的好方法吗?

java - 使用 Bouncy CaSTLe 重建私钥和公钥?