Java泛型:示例说明等等

Java泛型:示例说明等等,java,generics,Java,Generics,在另一种情况下,给出以下示例作为对OP的响应: public static <E> void funct1(final List<E> list1, final E something) { list1.add(something); } public static void funct2(final List<?> list, final Object something) { list.add(something); // does no

在另一种情况下,给出以下示例作为对OP的响应:

public static <E> void funct1(final List<E> list1, final E something)
{
    list1.add(something);
}

public static void funct2(final List<?> list, final Object something)
{
    list.add(something); // does not compile
}
publicstaticvoidfunct1(最终列表列表1,最终E)
{
增加(某物);
}
公共静态无效funct2(最终列表、最终对象)
{
list.add(某物);//不编译
}
我已经验证了funct1可以编译,而funct2不能编译。但是,我不知道为什么。

一个
列表
是一个特定但未知类型的列表。编译器不能允许调用带有泛型类型参数的方法,因为不能保证类型安全。它可以是
列表
,也可以是
列表
,不能向其中添加
对象。编译器必须使用编译器错误阻止此调用,以保持泛型提供的类型安全性

方法
funct1
可以编译,因为您始终可以向
列表添加
E
;它是相同的类型引用:
E
A
List
是一个特定但未知类型的列表。编译器不能允许调用带有泛型类型参数的方法,因为不能保证类型安全。它可以是
列表
,也可以是
列表
,不能向其中添加
对象。编译器必须使用编译器错误阻止此调用,以保持泛型提供的类型安全性

方法
funct1
可以编译,因为您始终可以向
列表添加
E
;这是同一类型的引用:
E

是正确的,但重要的是要说明这不仅适用于
列表
。它适用于所有泛型类型

如果使用通配符
声明参数化类型的变量,则不能使用参数化类型声明的相应类型变量,因为您不知道其值是什么。但是,您可以使用
null
,因为
null
可以在任何需要某种引用类型的值的地方使用

比如说

public class Example {
    public static void main(String[] str) throws Exception {
        Parameterized<?> exp = new Parameterized<String>();
        // below won't compile
        /*
           exp.something("tried my best");
           exp.something(666);
        */


        // below will compile
        exp.something(null);
    }    
}
class Parameterized<T> {
    public void something(T value) {}
}
公共类示例{
公共静态void main(字符串[]str)引发异常{
参数化exp=新参数化();
//下面不会编译
/*
exp.something(“竭尽全力”);
实验某物(666);
*/
//下面将编译
exp.something(空);
}    
}
类参数化{
公共无效某物(T值){}
}
是正确的,但重要的是要说明这不仅仅适用于
列表。它适用于所有泛型类型

如果使用通配符
声明参数化类型的变量,则不能使用参数化类型声明的相应类型变量,因为您不知道其值是什么。但是,您可以使用
null
,因为
null
可以在任何需要某种引用类型的值的地方使用

比如说

public class Example {
    public static void main(String[] str) throws Exception {
        Parameterized<?> exp = new Parameterized<String>();
        // below won't compile
        /*
           exp.something("tried my best");
           exp.something(666);
        */


        // below will compile
        exp.something(null);
    }    
}
class Parameterized<T> {
    public void something(T value) {}
}
公共类示例{
公共静态void main(字符串[]str)引发异常{
参数化exp=新参数化();
//下面不会编译
/*
exp.something(“竭尽全力”);
实验某物(666);
*/
//下面将编译
exp.something(空);
}    
}
类参数化{
公共无效某物(T值){}
}

我们不知道
list
是否是一个
列表
包含
对象
实例。编译错误是什么?我们不知道
list
是否是一个
列表
包含
对象
实例。编译错误是什么?在这种情况下什么排除了类型推断?在
列表
案例。
通配符不会从添加到
列表的对象推断类型。
通配符意味着我们故意不知道或不关心实际类型,只要它是一个特定类型。在这种情况下,什么排除了类型推断?在
列表中没有可推断的类型。
通配符不会从添加到
列表的对象推断类型。
通配符意味着我们故意不知道或不关心实际类型,只要它是一个特定类型。