Generics Java8:lambda函数中泛型版本的编译器错误

Generics Java8:lambda函数中泛型版本的编译器错误,generics,lambda,java-8,Generics,Lambda,Java 8,这里我只创建了两个简单的类Dad和Son,Son是Dad的一个子类 public class Dad { } public class Son extends Dad { } 然后我在另一个类中创建一个函数,以进行测试 public class Test { public static void main(String[] args) { Function<? extends Dad, String> fun = son -> son.toStri

这里我只创建了两个简单的类
Dad
Son
,Son是Dad的一个子类

public class Dad {
 }

public class Son extends Dad {
}
然后我在另一个类中创建一个
函数
,以进行测试

public class Test {
    public static void main(String[] args) {
        Function<? extends Dad, String> fun = son -> son.toString();
        fun.apply(new Son());
}
公共类测试{
公共静态void main(字符串[]args){

功能考虑以下因素:

class Daughter extends Dad {}

Function<Daughter, String> funcForDaughter = ...;
Function<? extends Dad, String> fun = funcForDaughter;  // ok

fun.apply(new Son()); 
类子元素扩展了Dad{}
函数funcForDaughter=。。。;

函数你能解释一下你想做什么吗?如果你知道你函数的参数
扩展了Dad
,那么为什么你不能用
function
而不是
function好的,首先我有一个枚举,元素的名称是SON1和SON2,这里有两个类SON1和SON2,它们都扩展了Dadide我得到了枚举的名称作为参数,像SON1或SON2一样,我想通过枚举的名称从数据库中查询SON1或SON2,并返回SON1的属性名或SON2的昵称,这两个属性都是字符串,但我不想使用if块来判断当前枚举,我只想通过名称获取枚举并通过枚举查询数据库,然后得到我想从enum中获取属性,所以我创建了一个属性函数。你能用enum添加代码吗?我不确定我是否能从你的描述中描述出你的类的结构。是的,感谢你的耐心,enum代码如下:
public enum EnumTest{SON1((SON1 SON1)->SON1.getName()),SON2((SON2 SON2 SON2)->son2.Get昵称();私有函数谢谢:),正如你所说,我不能像这样声明
函数Function@Tony:您正在尝试解决一个不存在的问题,使泛型问题变得复杂。只需使用
函数
。可以接受
Dad
实例的函数已经能够接受子类的立场,包括
Son
,如果
Son
Dad
的子类(相当奇怪)。您始终可以传递所需类型的子类的实例,这不是泛型,而是基本OOP。@霍尔格:谢谢您的回答,当我使用
函数fun
时,这是真的,它可以接受
Dad
的子类作为参数,但我不能用子类初始化函数,为什么我要使用泛型版本,因为有是
Dad
的两个子类,Son1和Son2,当出现Son1的实例时,我想得到Son1的值属性'name',如
Son1::getName
,当出现Son2的实例时,我想得到Son2的值属性'昵称',如
Son2::get昵称
,(参考我的下一个回复)@霍尔格:所以我定义了一个函数,比如
function声明,比如
function