标题:请问我下面的程序哪里错了啊 困扰了好久了
只看楼主
R的补
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2019-3-18
结帖率:100%
已结贴  问题点数:20 回复次数:10 
请问我下面的程序哪里错了啊 困扰了好久了
import java.util.Iterator;
import java.util.ArrayList;
import java.util.Collection;
public class 练习获取集合最大值
{
    public static void main(String[] args)
    {
        ArrayList<? extends Person> al = new ArrayList<>();
        al.add(new Student("ahjklhkalhkjlhf",53));
        al.add(new Student("xcvbxcvsdf",67));
        al.add(new Person("asdfasdf",45));
        al.add(new Person("ruytry",20));
        Person max=getMax(al);
        System.out.println(max);
    }
    public static <T extends Comparable<? super T>> T getMax(Collection <? extends T> c)
    {
        //迭代此从哪个集合那拿的元素,里面的类型就要和其一致
        //所以下面是? extends T不是? super T
        Iterator<? extends T> it = c.iterator();
        //思路1.定义变量记录集合中其中一个
        T max  =it.next();
        //2.遍历集合中的元素
        while(it.hasNext())
        {
            if(((it.next())>0))
            max=it.next();
        }
        return max;
    }
}
class Person
{
    private String name;
    private int age;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age=age;
    }
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public int compareTo(Person p)
    {
        int temp = this.age-p.age;
        return temp==0?this.(p.name):temp;
    }
}
class Student extends Person
{
    public Student(String name,int age)
    {
        super(name,age);
    }
}
搜索更多相关主题的帖子: public Person int name age 
2019-03-20 12:51
R的补
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2019-3-18
得分:0 
练习获取集合最大值.java:9: 错误: 不兼容的类型: Student无法转换为CAP#1
                al.add(new Student("ahjklhkalhkjlhf",53));
                       ^
  其中, CAP#1是新类型变量:
    CAP#1从? extends Person的捕获扩展Person
练习获取集合最大值.java:10: 错误: 不兼容的类型: Student无法转换为CAP#1
                al.add(new Student("xcvbxcvsdf",67));
                       ^
  其中, CAP#1是新类型变量:
    CAP#1从? extends Person的捕获扩展Person
练习获取集合最大值.java:11: 错误: 不兼容的类型: Person无法转换为CAP#1
                al.add(new Person("asdfasdf",45));
                       ^
  其中, CAP#1是新类型变量:
    CAP#1从? extends Person的捕获扩展Person
练习获取集合最大值.java:12: 错误: 不兼容的类型: Person无法转换为CAP#1
                al.add(new Person("ruytry",20));
                       ^
  其中, CAP#1是新类型变量:
    CAP#1从? extends Person的捕获扩展Person
练习获取集合最大值.java:13: 错误: 无法将类 练习获取集合最大值中的方法 getMax应用到给定类型;
                Person max=getMax(al);
                           ^
  需要: Collection<? extends T>
  找到: ArrayList<CAP#1>
  原因: 推论变量 T 具有不兼容的上限
    下限:Comparable<? super T>
    下限:CAP#1
  其中, T是类型变量:
    T扩展已在方法 <T>getMax(Collection<? extends T>)中声明的Comparable<? super T>
  其中, CAP#1是新类型变量:
    CAP#1从? extends Person的捕获扩展Person
注: 某些消息已经过简化; 请使用 -Xdiags:verbose 重新编译以获得完整输出
5 个错误
2019-03-20 12:52
R的补
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2019-3-18
得分:0 
二楼是编译时出错的提醒
2019-03-20 12:53
R的补
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2019-3-18
得分:0 
有没有大佬帮吗看一看啊
2019-03-20 14:37
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:5 
public class 练习获取集合最大值
{
    public static void main(String[] args)
    {
        ArrayList<Person> al = new ArrayList<>();
        al.add(new Student("ahjklhkalhkjlhf",53));
        al.add(new Student("xcvbxcvsdf",67));
        al.add(new Person("asdfasdf",45));
        al.add(new Person("ruytry",20));
        Person max=getMax(al);
        System.out.println(max);

剑栈风樯各苦辛,别时冰雪到时春
2019-03-20 16:18
R的补
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2019-3-18
得分:0 
回复 5楼 林月儿
感谢版主
但是还是有错
练习获取集合最大值.java:13: 错误: 无法将类 练习获取集合最大值中的方法 getMax应用到给定类型;
                Person max=getMax(al);
                           ^
  需要: Collection<? extends T>
  找到: ArrayList<CAP#1>
  原因: 推论变量 T 具有不兼容的上限
    下限:Comparable<? super T>
    下限:CAP#1
  其中, T是类型变量:
    T扩展已在方法 <T>getMax(Collection<? extends T>)中声明的Comparable<? super T>
  其中, CAP#1是新类型变量:
    CAP#1从? super Person的捕获扩展Object 超 Person
1 个错误
2019-03-20 19:45
R的补
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2019-3-18
得分:0 
有没有大佬帮忙看看。。。。
2019-03-21 11:52
rind
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:49
专家分:368
注 册:2018-3-8
得分:15 
泛型的理解问题。
? extends Person
表示的是Person的子类中特定的一个,只不过不知道是哪个。
就像:已知?是水果的一种,但并不意味着苹果、西瓜都是?仅仅知道?是一种水果,至于是哪种水果,关系不大,也不是关心的重点。
如果用在集合中,
这个主要是保存对集合的引用。
并且防止中途修改集合中的元素。(但是可以通过元素的方法调用修改元素的属性、状态)。
而对集合元素的调用仅仅限于Person的通用调用。可以了解一下泛型以及边界擦除。这点会利用到多态。
写法是:
程序代码:
ArrayList<? extends Person> al;
ArrayList<Student> ss= new ArrayList<>();
al =ss;                                        //保存Student数组的引用,?可以为Student
al.get(0).getAge();                            //对集合元素的方法的调用
ArrayList<Person> ps = new ArrayList<>();
al = ps;                                    //保存Person数组的引用,?可以为Person。


第二个问题是,你的getMax的方法的返回类型。表示T要实现Comparable接口。
你实现了接口方法,但是没有声明 ,没有使用@Override的习惯。
class Person implements Comparable<Person>{...}



[此贴子已经被作者于2019-3-21 14:28编辑过]


仅供参考,欢迎指正
2019-03-21 14:13
R的补
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2019-3-18
得分:0 
回复 8楼 rind
感谢大佬!!让我对泛型的理解有了更深的认识!真的十分感谢!
2019-03-21 18:36
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2276
专家分:10647
注 册:2015-3-19
得分:0 
没用编译器?

剑栈风樯各苦辛,别时冰雪到时春
2019-03-21 20:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-493703-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.425318 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved