如何创建一个只接受泛型参数而不接受原始类型参数的泛型方法?

How to create a generic method that accepts only generic parameters and not raw type parameters?

我想创建一个仅接受整数数组列表的通用方法。但该方法也接受原始类型。我怎样才能限制它只接受一个整数数组列表?

package generics;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class GenericBox<T> {
    public static void main(String[] args) {
        ArrayList l1 = new ArrayList();
        l1.add(1);
        l1.add("subbu");
        printListValues(l1);

        ArrayList<Integer> l2 = new ArrayList<>();
        l2.add(1);
        l2.add(2);
        printListValues(l2);
    }
    public static <T extends ArrayList<Integer>> void printListValues(T t){
        System.out.println(t);
    }
}

谢谢, 子部

But the method is also accepting a raw type

您是说要禁止此通话吗?

printListValues(new ArrayList());  // raw type

编译器将发出有关使用原始类型的警告,但它会编译。您也许可以告诉您的编译器(检查其文档或配置 GUI 以了解如何操作)将此视为错误,从而禁止它。

编译器通常允许这样做的原因是向后兼容。泛型是后来添加的(Java 5)并且是 "opt-in"。如果代码使用泛型类型,它们必须是正确的,但您可以完全放弃它。旧的 "raw" 代码仍然有效(这是 Java 的一个强大卖点)。

也许有一个编译器选项可以将警告转换为错误,因此您可以防止自己使用原始类型。但是你不能强迫别人那样做。

您根本无法阻止某人传递原始类型的列表。

无论好坏(如今大多是后者),原始类型都是语言中根深蒂固的一部分。没有办法摆脱他们。

但是,您的方法签名定义了一个契约:

public static void printListValues(ArrayList<Integer> t)

说 "To work correctly, I need an ArrayList (or null). If that list is not null, I expect all of its elements to be Integer or null; and I expect the list to be able to consume instances of Integer or null without causing problems for the caller"。

如果您传入任何其他内容,则行为未定义:买者自负。大多数时候,编译器会阻止这种情况发生,但如果类型检查被禁用(通过使用原始类型),你就只能靠自己了。

所以,不用担心人们传递原始类型的列表。如果他们忽略您的方法的约定,并忽略来自编译器的警告,他们将得到他们应得的一切。

你可以使用很多类型,你可以指定它应该接受什么样的类型

public class GenericBox<T> {
    public static void main(String[] args) {


        GenericProperties genericsPropertiesOnly=new GenericProperties();


        genericsPropertiesOnly.l2.add(1);
        genericsPropertiesOnly.l2.add(1);

        printListValues(genericsPropertiesOnly);
    }
//In here i am specifying to method should accept only Generic  from GenericProperties class

    public static <T extends GenericProperties> void printListValues(T t){ 
        System.out.println(t.l2);
    }

}

在这里您可以指定要使用的属性类型

public class GenericProperties {

    private ArrayList<Integer> list;

    private ArrayList<String> listw;

    ArrayList<Integer> l2 = new ArrayList<>();


}