没有收集的泛型

时间:2010-08-31 13:15:56

标签: java generics

我有一个方法,通常从列表中获取一个项目并具有以下标记:

myMethod(T item)

我想使用这种方法,但我知道我发送的方法是什么。

SpecificItem myItem = new SpecificItem();

myMethod((T) myItem);

这不适合我。这是不良代码的标志吗?

5 个答案:

答案 0 :(得分:9)

myMethod在泛型类中定义,有点像:

public class MyClass<T> {
   T myItem;

   public void myMethod(T item) {
      // do Something with item
   }

   public T myOtherMethod() {
      myMethod(myItem);   // casting is not necessary
      return myItem;
   }

}

如果您实例化此类,则将变量类型T与实际类型进行交换:

MyClass<SpecificItem > concreteClass = new MyClass<SpecificItem >();

如果您在此实例上调用myMethod,则必须提供SpecificItem,因为SpecificItem是此实例的通用类型。

(我不确定我的帖子是否回答了您的问题,请发表评论,以便我可以改进)

答案 1 :(得分:2)

你编码接口更好。例如:

在myMethod中:

<T extends <? super Item>> void (T item);

这告诉编译器只接受一个泛型类型的T,它是Item接口/类的实现/扩展。这将确保给定输入的类型正确。编译器保证它。

在主要班级:

Item myItem = new SpecificItem();

上面给出的代码是最佳做法。习惯它。但是(我不鼓励这样)你也可以像这样编码:

SpecificItem myItem = new SpecificItem();

您可以阅读Java源代码。例如,在类java.util.Collections中。在方法sort(List)中,您可能会注意到Joshua Bloch确保给定输入的格式始终正确。试一试,做到这一点:

public class Class1 {
    public static void main(String[] args) {
        List<Class1> list = new ArrayList<Class1>();

        Collections.sort(list);
    }
}

上面的代码会产生编译错误。要修复此编译错误,Class1必须实现Comparable接口。这保持了方法排序(List)的前提条件,它假定给定的输入是可比较的List。

哦,我差点忘了你的问题。实际上它不是一个糟糕的代码,因为它的工作原理。我只想告诉你,有更好的方法可以做到这一点。

答案 2 :(得分:1)

你可能正在寻找这样的东西:

class C<? extends T> {

   public void myMethod(T myItem) {
      ...
   }

}

答案 3 :(得分:1)

你调用方法的方式看起来很奇怪。如果您已将通用方法声明为

public <T> void myMethod(T item);

编译器知道,T是一些抽象类型,你不需要为它输出一个输入参数。请确保,T未在代码中声明为某种特定类型。

upd:在这里查看示例:http://www.java2s.com/Tutorial/Java/0200__Generics/Usinggenericmethodstoprintarrayofdifferenttypes.htm

答案 4 :(得分:0)

可能更好的方法是使SpecificItem成为T的子类或使T成为接口并让SpecificItem实现它。