无法在Java中形成带有两个问号的类型表达式
我既不能编译也不能重构以下代码来工作:无法在Java中形成带有两个问号的类型表达式,java,generics,Java,Generics,我既不能编译也不能重构以下代码来工作: public class DoubleQuestionMark { public static class Paired1<P,R> { } public static class Paired2<P,R> { } public static class Paired3<P,R> { } // regard it as third party method, not al
public class DoubleQuestionMark {
public static class Paired1<P,R> {
}
public static class Paired2<P,R> {
}
public static class Paired3<P,R> {
}
// regard it as third party method, not allowed to change signature
public static <S> void perform(Paired1<Paired2<S,?>, Paired3<S,?>> argument) {
}
public static void main(String[] args) {
Paired2<Integer, ?> p2 = new Paired2<>();
Paired3<Double, ?> p3 = new Paired3<>();
Paired1<Paired2<Integer, ?>, Paired3<Double, ?>> p1 = new Paired1<>();
perform(p1); // cannot be applied to given class
}
}
公共类双问号{
公共静态类Paired1{
}
公共静态类Paired2{
}
公共静态类Paired3{
}
//视为第三方方式,不允许更改签名
公共静态void perform(Paired1参数){
}
公共静态void main(字符串[]args){
Paired2 p2=新的Paired2();
Paired3 p3=新的Paired3();
Paired1 p1=新Paired1();
perform(p1);//不能应用于给定的类
}
}
如何准备一个对象,可由
执行方法接受?您正试图为同一类型参数S
传递两种不同的类型
Paired1
两个S
必须为同一类型:
因此,这将起作用:
Paired1<Paired2<Integer, ?>, Paired3<Integer, ?>> p1 = new Paired1<>();
perform(p1);
paired1p1=新的Paired1();
执行(p1);
但这不会:
Paired1<Paired2<Integer, ?>, Paired3<Double, ?>> p1 = new Paired1<>();
perform(p1);
paired1p1=新的Paired1();
执行(p1);
如果您需要传递两种不同的数字类型,整数和双扩展数字。因此,您可以使用:
Paired1<Paired2<Number, ?>, Paired3<Number, ?>> p1 = new Paired1<>();
paired1p1=新的Paired1();
您试图为同一类型参数S
传递两种不同的类型
Paired1
两个S
必须为同一类型:
因此,这将起作用:
Paired1<Paired2<Integer, ?>, Paired3<Integer, ?>> p1 = new Paired1<>();
perform(p1);
paired1p1=新的Paired1();
执行(p1);
但这不会:
Paired1<Paired2<Integer, ?>, Paired3<Double, ?>> p1 = new Paired1<>();
perform(p1);
paired1p1=新的Paired1();
执行(p1);
如果您需要传递两种不同的数字类型,整数和双扩展数字。因此,您可以使用:
Paired1<Paired2<Number, ?>, Paired3<Number, ?>> p1 = new Paired1<>();
paired1p1=新的Paired1();
注意,参数的类型是:
Paired1<Paired2<S,?>, Paired3<S,?>>
类Integer
和Double
有一个公共的超类Number
。当您将上面的行更改为以下内容时,它将起作用:
Paired1<Paired2<Number, ?>, Paired3<Number, ?>> p1 = new Paired1<>();
perform(p1); // ok
paired1p1=新的Paired1();
执行(p1);//好啊
注意,参数的类型是:
Paired1<Paired2<S,?>, Paired3<S,?>>
类Integer
和Double
有一个公共的超类Number
。当您将上面的行更改为以下内容时,它将起作用:
Paired1<Paired2<Number, ?>, Paired3<Number, ?>> p1 = new Paired1<>();
perform(p1); // ok
paired1p1=新的Paired1();
执行(p1);//好啊
查看我的新问题请:查看我的新问题请:查看我的新qstn请:查看我的新qstn请: