前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >谁说 Java 不能多继承

谁说 Java 不能多继承

作者头像
科技新语
发布于 2023-02-22 09:42:43
发布于 2023-02-22 09:42:43
61000
代码可运行
举报
运行总次数:0
代码可运行

我正在参加「掘金·启航计划」

从今以后,只要谁说Java不能多继承

我都会说,是的没错(秒怂)

要不你再看看标题写了啥?

没毛病啊,你说Java不能多继承,我也说Java不能多继承

这不是巧了么,没想到我们对一件事物的看法竟如此一致,看来这就是猿粪啊

此继承非彼继承

那你这又是唱哪出?

直接上图!

可以看到当我们在B类上添加注解@InheritClass并指定A1.classA2.class之后,我们的B实例就有了A1A2的属性和方法

就好像B同时继承了A1A2

这。。。难道是黑魔法?(为什么脑子里会突然冒出来巴啦啦能量?)

来人,把.class文件带上来

其实就是把A1A2的属性和方法都复制到了B上,和继承没有半毛钱关系!

这玩意儿有啥用

说起来现在实现的功能和当初的目的还是有点出入的

众所周知,Lombok中提供了@Builder的注解来生成一个类对应的Builder

但是我想在build之前校验某些字段就不太好实现

于是我就考虑,能不能实现一个注解,只是生成对应的字段和方法(毕竟最麻烦的就是要复制一堆的属性),而build方法由我们自己来实现,类似下面的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class A {

    private String a;
    
    public A(String a) {
        this.a = a;
    }
    
    @BuilderWith(A.class)
    public static class Builder {
    
        //注解自动生成 a 属性和 a(String a) 方法
    
        public A build() {
            if (a == null) {
                throw new IllegalArgumentException("a is null");
            }
            return new A(a);
        }
    }
}
复制代码

这样的话,我们不仅不用手动处理大量的属性,还可以在build之前加入额外的逻辑,不至于像Lombok@Builder那么不灵活

然后在后面实现的过程中就发现:

可以把一个类的属性复制过来,那也可以把一个类的方法复制过来!

可以复制一个类,那也可以复制多个类!

于是就发展成了现在这样,给人一种多继承的错觉

所以说这种方式也会存在很多限制和冲突,比如相同名称但不同类型的字段,相同名称相同入参但不同返回值的方法,或是调用了super的方法等等,毕竟只是一个缝合怪

这也许就是Java不支持多继承的主要原因,不然要校验要注意的地方就太多了,一不小心就会有歧义,出问题

目前我主要能想到两种使用场景

Builder

Builder本来就是我最初的目的,所以肯定要想着法儿的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class A {

    private String a;
    
    public A(String a) {
        this.a = a;
    }
    
    @InheritField(sources = A.class, flags = InheritFlag.BUILDER)
    public static class Builder {
    
        //注解自动生成 a 属性和 a(String a) 方法
    
        public A build() {
            if (a == null) {
                throw new IllegalArgumentException("a is null");
            }
            return new A(a);
        }
    }
}
复制代码

这个用法和之前设想的没有太大区别,就是对应的注解有点不太一样

@InheritField可以用来复制属性,然后flags = InheritFlag.BUILDER表示同时生成属性对应的方法

参数组合

另一种场景就是用来组合参数

比如我们现在有两个实体AB

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class A {

    private String a1;
    
    private String a2;
    
    ...
    
    private String a20;
}

@Data
public class B {

    private String b1;
    
    private String b2;
    
    ...
    
    private String b30;
}
复制代码

之前遇到过一些类似的场景,有一些比较老的项目,要加参数但是不能改参数的结构

一般情况下,如果要一个入参接收所有的参数我们会这样写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class Params extends B {

    private String a1;
    
    private String a2;
    
    ...
    
    private String a20;
}
复制代码

新写一个类继承属性多的B,然后把A的属性复制过去

但是如果修改了A就要同时修改这个新的类

如果用我们的这个就是这样的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@InheritField(sources = {A.class, B.class}, flags = {InheritFlag.GETTER, InheritFlag.SETTER})
public class Params {

}
复制代码

不需要手动复制了,AB如果有修改也会自动同步

当然这个功能也是很只因肋了,因为我想不出还有其他的用法了,哭

手把手教你实现

要实现这个功能需要分别实现对应的注解处理器和IDEA插件

注解处理器用于在编译的时候根据注解生成对应的代码

IDEA插件用于在标记注解后能够有对应的提示

Annotation Processor

我们先来实现注解处理器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class InheritProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        //自定义的处理流程
    }
    
    @Override
    public Set<String> getSupportedAnnotationTypes() {
        //需要扫描的注解的全限定名
        return new HashSet<>();
    }
}
复制代码

首先我们要继承javax.annotation.processing.AbstractProcessor这个类

其中getSupportedAnnotationTypes方法中返回需要扫描的注解的全限定名

然后就可以在process方法中添加自己的逻辑了,第一个参数Set<? extends TypeElement> annotations就是扫描到的注解

我们先拿到这些注解标注的类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class InheritProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (TypeElement annotation : annotations) {
            //获得标注了注解的类
            Set<? extends Element> targetClassElements = roundEnv.getElementsAnnotatedWith(annotation);
        }
    }
}
复制代码

通过第二个参数RoundEnvironment的方法getElementsAnnotatedWith就能获得标注了注解的类

接着我们来获得这些类的语法树,获得这些类的语法树之后,我们就可以通过语法树来修改这个类了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JavacElements elementUtils = (JavacElements) processingEnv.getElementUtils();

JCTree.JCClassDecl targetClassDef = (JCTree.JCClassDecl) elementUtils.getTree(targetClassElement);
复制代码

processingEnvAbstractProcessor中自带的,直接用就行了,通过processingEnv可以获得JavacElements对象

再通过JavacElements就可以获得类的语法树JCTree.JCClassDecl

为了后面更好区分,我们把这些标注了注解的类叫做【目标类】,把注解上标记的类叫做【来源类】,我们要将【来源类】中的字段和方法复制到【目标类】中

我们只要拿到【来源类】的语法树,就可以获得对应的字段和方法然后添加到【目标类】的语法树中

先通过【目标类】获得类上的注解然后筛选出我们需要的注解,这里我的注解因为支持了@Repeatable,所以还要多解析一步

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获得类上所有的注解
List<? extends AnnotationMirror> annotations = targetClassElement.getAnnotationMirrors();

//解析@Repeatable获得实际的注解
List<AnnotationMirror> children = (List<AnnotationMirror>)annotation.getElementValues().values();
复制代码

拿到注解之后,就可以获得注解上的属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private Map<String, Object> getAttributes(AnnotationMirror annotation) {
    Map<String, Object> attributes = new LinkedHashMap<>();
    for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : annotation.getElementValues().entrySet()) {
        Symbol.MethodSymbol key = (Symbol.MethodSymbol) entry.getKey();
        attributes.put(key.getQualifiedName().toString(), entry.getValue().getValue());
    }
    return attributes;
}
复制代码

通过方法getElementValues就可以获得注解方法和返回值的键值对,其中键为方法,所以直接强转Symbol.MethodSymbol就行了

而对应的值是特定了类型

值的类型

值的类

Attribute.Class

字符串

Attribute.Constant

枚举

Attribute.Enum

还有一些我没有用到所以这里就没有列出来了

所以我们拿到的值有的时候不能直接用,比如我们现在要获得【来源类】的语法树

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Attribute.Class attributeClass = ...
Type.ClassType sourceClass = (Type.ClassType)attribute.getValue();
JCTree.JCClassDecl sourceClassDef = (JCTree.JCClassDecl) elementUtils.getTree(sourceClass.asElement());
复制代码

通过上述的方式我们就可以拿到注解上的【来源类】的语法树

接着我们就可以把【来源类】上的字段和方法复制到【目标类】了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (JCTree sourceDef : sourceClassDef.defs) {
    //如果是非静态的字段
    if (InheritUtils.isNonStaticVariable(sourceDef)) {
        JCTree.JCVariableDecl sourceVarDef = (JCTree.JCVariableDecl) sourceDef;
        //Class 中未定义
        if (!InheritUtils.isFieldDefined(targetClassDef, sourceVarDef)) {
            //添加字段
            targetClassDef.defs = targetClassDef.defs.append(sourceVarDef);           
        }
    }
    
    //方法类似,这里不具体展示了
}
复制代码

通过【来源类】语法树的defs属性就能获得所有的字段和方法,筛选出我们需要的字段和方法之后再通过【目标类】语法树的defs属性的append方法添加就行了

这样我们就把一个类的字段和方法复制到了另一个类上

最后一步,我们需要在resources/META-INF/services下添加一个javax.annotation.processing.Processor的文件,并在文件中添加我们实现类的全限定类名

这一步也可以使用下面的方式自动生成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
compileOnly 'com.google.auto.service:auto-service:1.0.1'
annotationProcessor 'com.google.auto.service:auto-service:1.0.1'
复制代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@AutoService(Processor.class)
public class InheritProcessor extends AbstractProcessor {

}
复制代码

引入auto-service包后,在我们实现的InheritProcessor上标注@AutoService(Processor.class)注解就会在编译的时候自动生成对应的文件

到此我们的注解处理器就开发完成了

我们只需要用compileOnlyannotationProcessor引入我们的包就可以啦

Intellij Plugin

虽然我们实现了注解处理器,但是IDEA上是不会有提示的,这就需要另外开发IDEA的插件来实现对应的功能了

所以项目搭建之类的我就不啰嗦了

IDEA提供了很多接口用于扩展,这里我们要用到的就是PsiAugmentProvider这个接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class InheritPsiAugmentProvider extends PsiAugmentProvider {

    @Override
    protected @NotNull <Psi extends PsiElement> List<Psi> getAugments(@NotNull PsiElement element, @NotNull Class<Psi> type) {
        return new ArrayList<>();
    }
}
复制代码

getAugments方法就是用于获得额外的元素

其中第一个参数PsiElement element就是扩展的主体,以我们当前需要实现的功能来说,如果这个参数是类并且类上标注了我们指定的注解,那么我们就需要进行处理

第二个参数是需要的类型,以我们当前需要实现的功能来说,如果这个类型是字段或方法,那么我们就需要进行处理

直接看代码会清晰一点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class InheritPsiAugmentProvider extends PsiAugmentProvider {

    @Override
    protected @NotNull <Psi extends PsiElement> List<Psi> getAugments(@NotNull PsiElement element, @NotNull Class<Psi> type) {
        //只处理类
        if (element instanceof PsiClass) {
            if (type.isAssignableFrom(PsiField.class)) {
                //如果标记了注解,则返回额外的字段
            }
            if (type.isAssignableFrom(PsiMethod.class)) {
                //如果标记了注解,则返回额外的方法
            }
        }
        return new ArrayList<>();
    }
}
复制代码

也就是说扩展的字段和方法是分开来获取的,另外需要注意是额外的字段和方法,不是全部的字段和方法

接下来我们需要先获得类上的注解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private Collection<PsiAnnotation> findAnnotations(PsiClass targetClass) {
    Collection<PsiAnnotation> annotations = new ArrayList<>();
    for (PsiAnnotation annotation : targetClass.getAnnotations()) {
        if ("注解的全限定名".contains(annotation.getQualifiedName())) {
            annotations.add(annotation);
        }
        if ("@Repeatable注解的全限定名".contains(annotation.getQualifiedName())) {
            handleRepeatableAnnotation(annotation, annotations);
        }
    }
    return annotations;
}

/**
 * 获得 Repeatable 中的实际注解
 */
private void handleRepeatableAnnotation(PsiAnnotation annotation, Collection<PsiAnnotation> annotations) {
    PsiAnnotationMemberValue value = annotation.findAttributeValue("value");
    if (value != null) {
        PsiElement[] children = value.getChildren();
        for (PsiElement child : children) {
            if (child instanceof PsiAnnotation) {
                annotations.add((PsiAnnotation) child);
            }
        }
    }
}
复制代码

获得注解之后,我们就可以通过注解获得注解的属性了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Collection<PsiType> sources = findTypes(annotation.findAttributeValue("sources"));

private Collection<PsiType> findTypes(PsiElement element) {
        Collection<PsiType> types = new HashSet<>();
        findTypes0(element, types);
        return types;
    }

private void findTypes0(PsiElement element, Collection<PsiType> types) {
    if (element == null) {
        return;
    }
    if (element instanceof PsiTypeElement) {
        PsiType type = ((PsiTypeElement) element).getType();
        types.add(type);
    }
    for (PsiElement child : element.getChildren()) {
        findTypes0(child, types);
    }
}
复制代码

这里需要注意,Psi是文件树而不是语法树

比如这样的写法@InheritClass(sources = {A.class, B.class})

我们通过findAttributeValue("sources")得到的是{A.class, B.class},最上层是{}{}的子节点才是A.class, B.class,所以Psi体现的是文件的结构

接着我们就可以获得对应的字段和方法了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PsiClass sourceClass = PsiUtil.resolveClassInType(PsiType);

/**
 * 获得所有字段
 */
public static Collection<PsiField> collectClassFieldsIntern(@NotNull PsiClass psiClass) {
    if (psiClass instanceof PsiExtensibleClass) {
        return new ArrayList<>(((PsiExtensibleClass) psiClass).getOwnFields());
    } else {
        return filterPsiElements(psiClass, PsiField.class);
    }
}

/**
 * 获得所有方法
 */
public static Collection<PsiMethod> collectClassMethodsIntern(@NotNull PsiClass psiClass) {
    if (psiClass instanceof PsiExtensibleClass) {
        return new ArrayList<>(((PsiExtensibleClass) psiClass).getOwnMethods());
    } else {
        return filterPsiElements(psiClass, PsiMethod.class);
    }
}

private static <T extends PsiElement> Collection<T> filterPsiElements(@NotNull PsiClass psiClass, @NotNull Class<T> desiredClass) {
    return Arrays.stream(psiClass.getChildren()).filter(desiredClass::isInstance).map(desiredClass::cast).collect(Collectors.toList());
}
复制代码

上面这几个方法我都是从Lombok里面复制过来的,至于else分支我也看不懂,可能会有多种情况,我也没遇到过,hhh

然后我们就可以对字段和方法进行复制啦

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String fieldName = field.getName();
LightFieldBuilder fieldBuilder = new LightFieldBuilder(
    manager, 
    fieldName, 
    field.getType());
//访问限定
fieldBuilder.setModifierList(new LightModifierList(field));
//初始化
fieldBuilder.setInitializer(field.getInitializer());
//所属的Class
fieldBuilder.setContainingClass(targetClass);
//是否 Deprecated
fieldBuilder.setIsDeprecated(field.isDeprecated());
//注释
fieldBuilder.setDocComment(field.getDocComment());
//导航
fieldBuilder.setNavigationElement(field);
复制代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LightMethodBuilder methodBuilder = new LightMethodBuilder(
    manager, 
    JavaLanguage.INSTANCE, 
    method.getName(), 
    method.getParameterList(), 
    method.getModifierList(), 
    method.getThrowsList(), 
    method.getTypeParameterList());
//返回值
methodBuilder.setMethodReturnType(method.getReturnType());
//所属的 Class
methodBuilder.setContainingClass(targetClass);
//导航
methodBuilder.setNavigationElement(method);
复制代码

这里大家一定要新实例化所有的字段和方法,不要直接返回【来源类】的字段和方法,因为【来源类】的字段和方法是和【来源类】关联的,而我们返回的是【目标类】的字段和方法,两者不匹配会导致IDEA直接报错

最后我们只需要在plugin.xml中添加这个扩展就行了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<extensions defaultExtensionNs="com.intellij">

    <lang.psiAugmentProvider implementation="xxx.xxx.xxx.InheritPsiAugmentProvider"/>

</extensions>
复制代码

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深圳先进院李骁健团队:植入式脑机接口技术向医疗器械转化的问题与挑战
近几年植入式脑机接口技术取得了非常显著的进步,从工程实现能力和服务功能场景来说,脑机接口技术已经达到了临床应用的临界点,在实验室科研成果向临床医疗器械转化过程中将会面临新的挑战。本文章由此出发,首先介绍了脑机接口技术常用的信号源,包括脑电图、皮层电图以及皮层内电信号的特点,其次叙述了解码能力和信息双向闭环的考量,并讨论了目前脑机接口商用机设计中存在的稳定性、生物相容性挑战,最后简单阐述产业化发展中政策、资金和技术路线的协同发展。本文旨在探讨植入式脑机接口技术在应用于医疗领域过程中在技术路线、产业发展等方面面临的问题与挑战。
脑机接口社区
2023/10/23
6800
深圳先进院李骁健团队:植入式脑机接口技术向医疗器械转化的问题与挑战
脑机接口破圈医疗!对五种疾病或有奇效,难怪马斯克吹爆【附下载】| 智东西内参
在马斯克“三只小猪和打游戏猴子”的推动下,脑机接口(Brain Computer Interface,BCI )技术近些年走近了大众视野。
脑机接口社区
2022/09/22
9030
脑机接口破圈医疗!对五种疾病或有奇效,难怪马斯克吹爆【附下载】| 智东西内参
将植入式脑机接口转化为医疗设备面临的挑战
植入式脑机接口(iBCI)是目前一大快速发展的有源植入式医疗设备领域。为了实现大脑与计算机/机器之间的直接通信,iBCI通过在大脑中植入电极(包括皮质电图(ECoG)电极)来收集神经信号,从而实现神经元水平的直接信号读取。由于iBCI能够收集高通量和高时空分辨率的神经信号,因此在实现实时、精确的脑机交互和临床应用方面,iBCI比非侵入式BCI具有更大的潜力,包括缺陷恢复/替代和精神障碍诊断/治疗。
脑机接口社区
2023/11/24
2170
将植入式脑机接口转化为医疗设备面临的挑战
深度解析脑机接口技术的现状与未来!
通过在脑后插入一根线缆,我们就能够畅游计算机世界;只需一个意念我们就能改变“现实”;学习知识不再需要通过书本、视频等媒介,也不需要在花费大量的时间,只需直接将知识传输到大脑当中即可。这是1999年上映的经典科幻片《黑客帝国》当中,为我们描绘的画面。这并非是天马行空的幻想,而是基于早已有之的“脑机接口”技术的的合理设想。
数据猿
2020/06/28
2K0
深度解析脑机接口技术的现状与未来!
脑机接口技术具体如何实现,用不用做手术植入电极?
企鹅号小编
2017/12/25
1K0
脑机接口技术具体如何实现,用不用做手术植入电极?
赵继宗院士:脑机接口技术临床研究
脑机接口经历了学术探索、科学论证、应用实验三个历史时期。对脑机接口的研究可以追溯至1924年,德国精神科医生汉斯·贝格发现了脑电波,人们注意到意识可以转化为电子信号被读取。以此为基础,脑机接口技术开始起步并逐步发展。1969年德裔美国神经学家埃伯哈德·费兹将猴大脑中的一个神经元连接到一个仪表盘,这只猴成为第一个真正的脑机接口被试对象。1970—2000年脑机接口进入科学论证阶段。
脑机接口社区
2023/09/19
3210
赵继宗院士:脑机接口技术临床研究
CNS与脑科学:神经系统疾病闭环诊疗新格局丨华兴医疗观点
在智慧医疗领域,脑科学和脑认知的突破给神经系统疾病的诊疗带来了新格局。近年来,各国政府投入巨大,先后发起脑科学计划,尝试破解更多大脑的秘密。在“第十届华兴资本医疗与生命科技领袖峰会—智慧医疗圆桌论坛”中,几位嘉宾分享了对脑机接口修复脑损伤的看法、高质量商业化落地的路径和经验,同时畅想了未来国内脑科学发展的前景。希望本篇论坛内容为您带来对于脑科学的新认识。更多峰会精彩内容,敬请期待。
脑机接口社区
2023/02/14
3050
CNS与脑科学:神经系统疾病闭环诊疗新格局丨华兴医疗观点
脑机接口概述专题一 | 从运动脑机接口到情绪脑机接口:马斯克脑机接口公司Neuralink背后的原理
编者的话:这篇文章是专业顶刊里发表的唯一一篇提出把脑机接口概念从运动系统扩展到情绪系统的观点文章,而且从系统实现的角度该说的基本也都说了。本质上讲,脑机接口是控制与学习的过程,是贯通神经系统与计算机系统的智能科学。脑机接口又是涉及多种技术有机集成的大工程。高级形式的脑机接口将是人脑智能与人工智能的集大成者。目前的技术瓶颈在其最前端的神经界面上,信号的质量和带宽都被其所限。很多人知道马斯克的脑机接口公司-Neuralink。有人仿制他们的模拟前端芯片就号称可以正面PK了,这种想法显然肤浅了。他们目前展示的仅仅是脑机接口的部分前端技术-信号转换器。这篇文章就是在讲它后边的事。
脑机接口社区
2020/07/01
1K0
脑机接口概述专题一 | 从运动脑机接口到情绪脑机接口:马斯克脑机接口公司Neuralink背后的原理
领先Neuralink!国产侵入式脑机接口技术进展神速:已完成多项临床实验!
提到脑机接口技术,很多人第一时间会想到特斯拉CEO马斯克创立的脑机接口公司Neuralink,作为一家基于侵入式脑机接口技术的公司,Neuralink在今年5月26日还率先获得美国FDA的批准进行人体临床实验,在全球脑机接口技术领域居于领先地位。相对于侵入式脑机接口技术来说,非侵入式及半侵入式的脑机接口技术的门槛和风险要更低一些,这也从事侵入式脑机接口技术的企业相对较少。那么目前国内厂商在侵入式脑机接口技术方面发展的如何呢?
芯智讯
2023/12/28
5170
领先Neuralink!国产侵入式脑机接口技术进展神速:已完成多项临床实验!
浙江大学在侵入式脑机接口领域实现突破,中文识别率已达96%!
虽然马斯克的Neuralink引发了外界对于脑机接口技术的广泛关注,但其实这一项技术已经发展了50年之久。建立人机完全合一的脑机智能是针对此类应用的远景,而着眼当前,在神经、运动康复方面,包括脑疾病的治疗、运动的重建、运动的恢复和康复;以及感知觉,包括人工耳窝、视网膜的康复应用等。对于这一类特殊人群,脑机接口技术能够真正帮助到他们构建和外界正常联系,并且减少其患病风险。
芯智讯
2023/12/28
6450
浙江大学在侵入式脑机接口领域实现突破,中文识别率已达96%!
2025,脑机接口会颠覆我们的生活吗?
近年来,脑机接口(Brain-Computer Interface,简称 BCI)技术愈发受到关注,从科研实验室逐步迈向大众视野,成为科技领域的热门话题之一。这项被誉为 “人机交互终极形态” 的技术,被认为在 2025 年将迎来关键节点,其发展前景引发了广泛的讨论和期待:它真的会在 2025 年迎来大爆发吗?又将如何改变我们的生活?今天,就让我们一同深入探讨这个充满科幻色彩却又即将成为现实的领域。
天涯学馆
2024/12/27
4050
2025,脑机接口会颠覆我们的生活吗?
深脑接口 | 清华大学李路明团队NSR综述
如何让机器与人类的大脑深处实现交互?清华大学李路明教授研究团队在《国家科学评论》(National Science Review, NSR)发表综述文章,介绍深脑接口(Deep Brain Machine Interface, DBMI)的发展历程与前沿进展。
脑机接口社区
2023/02/14
6090
深脑接口 | 清华大学李路明团队NSR综述
反思脑机接口技术:机器真的能控制我们的大脑吗?
猛烈的公牛在冲锋的途中锁定了双腿。它将双蹄扎进地下,在与之搏斗的人类参赛选手被刺伤之前停了下来。
AI科技评论
2021/07/02
5300
探索脑机接口技术的潜在医学应用
脑机接口 (BCI) 技术是一个快速发展的领域,有可能彻底改变我们与技术和周围世界互动的方式。从控制假肢到恢复严重残疾患者的运动和沟通,BCI 技术为改善人类健康和生活质量带来了巨大希望。然而,与任何技术一样,脑机接口技术也存在潜在风险和危害,尤其是在医疗领域。
脑机接口社区
2023/09/19
3070
探索脑机接口技术的潜在医学应用
原创 | 脑机接口不断迎来重大突破,“思想钢印”还会远吗?
上个月,脑机接口领域再次迎来重大突破:使瘫痪者成功恢复运动能力,触觉准确率高达 90%。
数据派THU
2020/05/26
6450
情绪脑机接口:脑机接口概述专题三 | 从运动脑机接口到情绪脑机接口
编者的话:这篇文章是专业顶刊里发表的唯一一篇提出把脑机接口概念从运动系统扩展到情绪系统的观点文章,而且从系统实现的角度该说的基本也都说了。本质上讲,脑机接口是控制与学习的过程,是贯通神经系统与计算机系统的智能科学。脑机接口又是涉及多种技术有机集成的大工程。高级形式的脑机接口将是人脑智能与人工智能的集大成者。目前的技术瓶颈在其最前端的神经界面上,信号的质量和带宽都被其所限。很多人知道马斯克的脑机接口公司-Neuralink。有人仿制他们的模拟前端芯片就号称可以正面PK了,这种想法显然肤浅了。他们目前展示的仅仅是脑机接口的部分前端技术-信号转换器。这篇文章就是在讲它后边的事。
脑机接口社区
2023/02/13
5870
哈佛专家披露:马斯克侵入式脑机接口技术的三个进展与三大局限
美国时间 8 月 28 日下午,侵入式脑机接口技术公司 Neuralink 的创始人、科技英雄「硅谷钢铁侠」埃隆-马斯克举行了他戏称为「三只小猪」的发布会。
新智元
2020/09/17
7900
哈佛专家披露:马斯克侵入式脑机接口技术的三个进展与三大局限
脑虎科技NeuroXess完成数亿元A轮融资,持续推进侵入式脑机接口发展
12月28日,全球侵入式脑机接口解决方案领航者——脑虎科技NeuroXess(以下简称“脑虎科技”)正式宣布完成数亿元人民币A轮融资。本轮融资由中平资本领投,轻舟资本、国生资本(成都生物城)、上海赛领、演化博弈参与跟投,现有投资方盛大、联新资本、红杉中国持续追加投资。华兴资本担任本轮交易的独家财务顾问。
脑机接口社区
2023/02/14
2950
脑虎科技NeuroXess完成数亿元A轮融资,持续推进侵入式脑机接口发展
浅谈脑机接口:传统神经学科的颠覆者
人类从未停止对大脑的研究,然而有关于大脑的探秘如今所发现的也仅仅只是冰山一角,作为神秘的研究领域,脑科学直到下个世纪仍是前沿科学。
脑机接口社区
2022/09/22
5540
浅谈脑机接口:传统神经学科的颠覆者
美推进脑机接口技术研发
4月9日,美一家公司公布一段猕猴玩乒乓球游戏的视频,让脑机接口技术再度引发热议。而这一技术背后所潜藏的颠覆性潜力,早已引起美国军方尤其是美国防部高级研究计划局(以下简称DARPA)的高度重视。
脑机接口社区
2023/02/13
3620
推荐阅读
深圳先进院李骁健团队:植入式脑机接口技术向医疗器械转化的问题与挑战
6800
脑机接口破圈医疗!对五种疾病或有奇效,难怪马斯克吹爆【附下载】| 智东西内参
9030
将植入式脑机接口转化为医疗设备面临的挑战
2170
深度解析脑机接口技术的现状与未来!
2K0
脑机接口技术具体如何实现,用不用做手术植入电极?
1K0
赵继宗院士:脑机接口技术临床研究
3210
CNS与脑科学:神经系统疾病闭环诊疗新格局丨华兴医疗观点
3050
脑机接口概述专题一 | 从运动脑机接口到情绪脑机接口:马斯克脑机接口公司Neuralink背后的原理
1K0
领先Neuralink!国产侵入式脑机接口技术进展神速:已完成多项临床实验!
5170
浙江大学在侵入式脑机接口领域实现突破,中文识别率已达96%!
6450
2025,脑机接口会颠覆我们的生活吗?
4050
深脑接口 | 清华大学李路明团队NSR综述
6090
反思脑机接口技术:机器真的能控制我们的大脑吗?
5300
探索脑机接口技术的潜在医学应用
3070
原创 | 脑机接口不断迎来重大突破,“思想钢印”还会远吗?
6450
情绪脑机接口:脑机接口概述专题三 | 从运动脑机接口到情绪脑机接口
5870
哈佛专家披露:马斯克侵入式脑机接口技术的三个进展与三大局限
7900
脑虎科技NeuroXess完成数亿元A轮融资,持续推进侵入式脑机接口发展
2950
浅谈脑机接口:传统神经学科的颠覆者
5540
美推进脑机接口技术研发
3620
相关推荐
深圳先进院李骁健团队:植入式脑机接口技术向医疗器械转化的问题与挑战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验