Java 获取抽象类、接口和扩展类以实现无通配符的泛型时出错
从四处搜索中可以清楚地看出,这是其他人所面临的问题。然而,我似乎无法获得其他人提供的使用泛型而不是通配符编译的解决方案,因为这里接口的额外复杂性 下面的代码可以编译,但我不喜欢使用通配符而不是泛型 JavaJava 获取抽象类、接口和扩展类以实现无通配符的泛型时出错,java,generics,Java,Generics,从四处搜索中可以清楚地看出,这是其他人所面临的问题。然而,我似乎无法获得其他人提供的使用泛型而不是通配符编译的解决方案,因为这里接口的额外复杂性 下面的代码可以编译,但我不喜欢使用通配符而不是泛型 Java import java.util.List; public interface ListSorter <T> { public List<T> sort(List<T> list); } import java.util.List; 公共接口列表
import java.util.List;
public interface ListSorter <T> {
public List<T> sort(List<T> list);
}
import java.util.List;
公共接口列表分类器{
公共列表排序(列表);
}
AbstractListSorteTest.java
package com.learning.test.algorithms;
import com.learning.algorithms.sorting.ListSorter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import junit.framework.TestCase;
public abstract class AbstractListSorterTest extends TestCase {
private List<String> unsortedStringList;
private List<String> sortedStringList;
// Eclipse shows "ListSorter is a raw type. References to generic type ListSorter<T> should be parameterized"
protected abstract ListSorter createListSorter();
public void testSortSimpleStrings() {
ListSorter sorter = createListSorter();
List<?> result = sorter.sort(unsortedStringList);
assertEquals(unsortedStringList.size(), result.size());
Iterator<?> actual = result.iterator();
Iterator<?> expected = sortedStringList.iterator();
while (actual.hasNext() && expected.hasNext()) {
assertEquals(expected.next(), actual.next());
}
}
public class BubblesortListSorterTest<T extends Comparable<? super T>> extends AbstractListSorterTest {
@Override
protected ListSorter<T> createListSorter() {
return new BubblesortListSorter<T>();
}
}
public class BubblesortListSorterTest extends AbstractListSorterTest {
@Override
protected <T extends Comparable<? super T>> ListSorter<T> createListSorter() {
return new BubblesortListSorter<T>();
}
}
protected abstract <T extends Comparable<? super T>> ListSorter<T> createListSorter();
public void testSortSimpleStrings() {
ListSorter<String> sorter = createListSorter();
List<String> result = sorter.sort(unsortedStringList);
assertEquals(unsortedStringList.size(), result.size());
Iterator<String> actual = result.iterator();
Iterator<String> expected = sortedStringList.iterator();
while (actual.hasNext() && expected.hasNext()) {
assertEquals(expected.next(), actual.next());
}
}
包com.learning.test.algorithms;
导入com.learning.algorithms.sorting.ListSorter;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入junit.framework.TestCase;
公共抽象类AbstractListSortTest扩展了TestCase{
私有列表未分类的字符串列表;
私人名单分类名单;
//Eclipse显示“ListSorter是一个原始类型。对泛型类型ListSorter的引用应该参数化”
受保护的抽象ListSorter createListSorter();
public void testSortSimpleStrings(){
ListSorter-sorter=createListSorter();
列表结果=sorter.sort(unsortedStringList);
assertEquals(unsortedStringList.size(),result.size());
迭代器实际值=result.Iterator();
应为迭代器=sortedStringList.Iterator();
while(实际的.hasNext()&&expected.hasNext()){
assertEquals(预期的.next(),实际的.next());
}
}
如果我尝试以下方法:
List<T> result = sorter.sort(unsortedStringList);
List result=sorter.sort(unsortedStringList);
我得到一个编译器错误“T不能被解析为一种类型”(我得到了很多不同类型的解决方案)
更新
斯图尔特的回答恰到好处,我现在还有一个警告
在BubbleSortListSortTest.java中,我得到以下警告:
The return type ListSorter<T> for createListSorter() from the type BubblesortListSorterTest<T> needs unchecked conversion to conform to ListSorter<Object> from the type AbstractListSorterTest
类型BubbleSortListSorteTest中createListSorter()的返回类型ListSorter需要未经检查的转换,以符合类型AbstractListSorteTest中的ListSorter
BubbleSortListSortTest.java
package com.learning.test.algorithms;
import com.learning.algorithms.sorting.ListSorter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import junit.framework.TestCase;
public abstract class AbstractListSorterTest extends TestCase {
private List<String> unsortedStringList;
private List<String> sortedStringList;
// Eclipse shows "ListSorter is a raw type. References to generic type ListSorter<T> should be parameterized"
protected abstract ListSorter createListSorter();
public void testSortSimpleStrings() {
ListSorter sorter = createListSorter();
List<?> result = sorter.sort(unsortedStringList);
assertEquals(unsortedStringList.size(), result.size());
Iterator<?> actual = result.iterator();
Iterator<?> expected = sortedStringList.iterator();
while (actual.hasNext() && expected.hasNext()) {
assertEquals(expected.next(), actual.next());
}
}
public class BubblesortListSorterTest<T extends Comparable<? super T>> extends AbstractListSorterTest {
@Override
protected ListSorter<T> createListSorter() {
return new BubblesortListSorter<T>();
}
}
public class BubblesortListSorterTest extends AbstractListSorterTest {
@Override
protected <T extends Comparable<? super T>> ListSorter<T> createListSorter() {
return new BubblesortListSorter<T>();
}
}
protected abstract <T extends Comparable<? super T>> ListSorter<T> createListSorter();
public void testSortSimpleStrings() {
ListSorter<String> sorter = createListSorter();
List<String> result = sorter.sort(unsortedStringList);
assertEquals(unsortedStringList.size(), result.size());
Iterator<String> actual = result.iterator();
Iterator<String> expected = sortedStringList.iterator();
while (actual.hasNext() && expected.hasNext()) {
assertEquals(expected.next(), actual.next());
}
}
公共类BubbleSortListSortestAbstractListSortest
希望使用字符串列表测试一个ListSorter
实现。因此测试需要告诉创建ListSorter
的人T
应该是String
。如果直接实例化ListSorter
(比如,作为一个匿名的内部类)一个人会写这样的东西
ListSorter<String> sorter = new ListSorter<String>() { ... };
然后将测试中的调用点更改为:
ListSorter<String> sorter = createListSorter();
ListSorter-sorter=createListSorter();
(在本例中,编译器推断T
是String
,因此不必传递显式类型参数。)
此时,您可以将后续声明从Iterator
更改为Iterator
您将遇到的下一个问题是
ListSorter
实现将无法对任意类型的T
对象进行排序,因为无法对它们进行比较。您必须将comparator对象传递给ListSorter
抽象工厂和构造函数,或者必须向e添加类型边界确保T
是Comparable
的子类型。查看中的集合.sort()
重载,了解需要添加的泛型类型签名的想法。非常有用!只剩下一个编译器警告。“createListSorter()的返回类型ListSorter”从类型BubbleSortListSorteTest需要取消选中转换,以符合类型AbstractListSorteT BubbleSortListSorteTest.java中的ListSorteTer”不确定ListSorter
来自何处。我必须查看代码。您可能必须在创建调用中指定一个显式类型,例如,ListSorter-sorter=this.createListSorter()
。我发布了两个更新,它现在100%工作。大部分代码都在上面。非常感谢!