Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取抽象类、接口和扩展类以实现无通配符的泛型时出错_Java_Generics - Fatal编程技术网

Java 获取抽象类、接口和扩展类以实现无通配符的泛型时出错

Java 获取抽象类、接口和扩展类以实现无通配符的泛型时出错,java,generics,Java,Generics,从四处搜索中可以清楚地看出,这是其他人所面临的问题。然而,我似乎无法获得其他人提供的使用泛型而不是通配符编译的解决方案,因为这里接口的额外复杂性 下面的代码可以编译,但我不喜欢使用通配符而不是泛型 Java import java.util.List; public interface ListSorter <T> { public List<T> sort(List<T> list); } import java.util.List; 公共接口列表

从四处搜索中可以清楚地看出,这是其他人所面临的问题。然而,我似乎无法获得其他人提供的使用泛型而不是通配符编译的解决方案,因为这里接口的额外复杂性

下面的代码可以编译,但我不喜欢使用通配符而不是泛型

Java

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%工作。大部分代码都在上面。非常感谢!