为什么不能从通用参数访问属性?

时间:2018-10-07 18:57:33

标签: 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"));
}

我正在尝试将资产对象存储在Java HashMap中,其中资产提供了一种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);
    }

}

我有两种资产希望存放在(参数化的)存款中。

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);} }

为什么我不能访问资产自变量的标题?

2 个答案:

答案 0 :(得分:2)

因为您的行self._pred-这里的in_degree(与常用的public class Portfolio<Asset>Asset等相同)只是泛型声明,它与您的课程无关T

只需从U类声明中删除Asset

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

java generics

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

Java Generics FAQ


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

<Asset>

并且:

Portfolio

答案 1 :(得分:1)

from google.colab import drive drive.mount('/content/gdrive') 通用类型未在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);
    }

}