它总是抱怨:

The method add(Matrix<T>) in the type List<Matrix<T>> is not applicable for the arguments (Matrix<String>)


在Extractor类的行中:

matrixList.add(new Matrix<String>(attributes));


在这3个类中定义我的泛型似乎有问题。有一种简单的方法可以解决此问题吗?尝试了不同的方法,无法解决。

public class Test {

    public static void main(String[] args) {

        Extractor<String> extractor = new Extractor<>();
        extractor.extract();
    }
}

class Extractor<T> {

    private List<Matrix<T>> matrixList;

    public Extractor() {
        this.matrixList = new ArrayList<>();
    }

    public void extract() {
        List<Attribute<String>> attributes = new ArrayList<>();

        attributes.add(new Attribute<String>("Test 1"));
        attributes.add(new Attribute<String>("Test 2"));

       // !!!! The compiler is complaining here!
        matrixList.add(new Matrix<String>(attributes));
    }

    public List<Matrix<T>> getList() {
        return matrixList;
    }
}

class Matrix<T> {

    private List<Attribute<T>> attributes;

    public Matrix(List<Attribute<T>> attributes) {
        this.attributes = attributes;
    }

    public List<Attribute<T>> getAttributes() {
        return attributes;
    }
}

class Attribute<T> {
    private T attribute;
    public Attribute(T attr) {
        attribute = attr;
    }

    public T getAttr() {
        return attribute;
    }
}

最佳答案

您的代码根本没有意义。您正在使Extractor等通用,这意味着您希望它适用于不同类型。

但是,在Extractor.extract()方法中,将专门创建MatrixString并将其放入List<Matrix<T>> matrixList中。

如果您的代码仅适用于String,则不应使其通用。只需使List<Matrix<String>> matrixList

想一想:如果现在要创建一个Extractor<Integer> intExtractor,并调用intExtractor.extract(),那么如何合理地运行代码?

或者,要进一步完善您的设计,请执行以下操作:

interface Extractor<T> {
    public List<Matrix<T>> extract();
}

class DummyStringMatrixExtractor implements Extractor<String> {

    // useless now, can be put in extract()
    private List<Matrix<T>> matrixList;

    public Extractor() {
        this.matrixList = new ArrayList<>();
    }

    @Override
    public List<Matrix<String>> extract() {
        List<Attribute<String>> attributes = new ArrayList<>();

        attributes.add(new Attribute<String>("Test 1"));
        attributes.add(new Attribute<String>("Test 2"));

        matrixList.add(new Matrix<String>(attributes));

        return matrixList;
    }

    // useless now
    public List<Matrix<T>> getList() {
        return matrixList;
    }
}

关于java - 编译器对我的Java泛型不满意,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44447931/

10-11 00:23