总是抱怨:
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;
}
}
答案 0 :(得分:5)
您的代码根本没有意义。您正在使Extractor
等通用,这意味着您希望它适用于不同类型。
但是,在Extractor.extract()
方法中,您专门创建Matrix
String
并将其放入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;
}
}
答案 1 :(得分:1)
您无法将Matrix<String>
添加到Matrix<T>
列表中(此处T
可以是任何类型)。如果Extractor
仅适用于String类型的Matrix,请从那里删除type参数并将matrixList
类型设置为List<Matrix<String>>
。
答案 2 :(得分:0)
一个简单的解决方案是使用<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>demo1</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<skip>true</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
代替。
该代码强加了泛型的非常常见的转换问题。
代码matrixList.add((Matrix<T>) new Matrix<String>(attributes));
中显示的方法意味着您要将 Matrix 元素添加到容器 matrixList ,该容器被定义为包含通用模板类型。< / p>
您可以在文档over here
中找到有关此类障碍的简单说明